2014-10-05 161 views
1

由於$ _SERVER ['REQUEST_URI']我的PHP應用程序不能正常工作,因此['REQUEST_URI']將完整的url返回給腳本而不是相對路徑。

我的環境:
Windows 7 64位。
XAMPP版本1.8.2
PHP版本5.4.16
的Apache版本的Apache/2.4.4(Win32的)的OpenSSL/0.9.8y PHP/5.4.16

我的虛擬主機的conf:

<VirtualHost *:80> 
DocumentRoot "D:/HTDOCS/ivankristianto" 
ServerName www.ivankristianto.local 
UseCanonicalName Off 
<Directory "D:/HTDOCS/ivankristianto"> 
    Options Indexes FollowSymLinks MultiViews 
    AllowOverride all 
    Require all granted 
</Directory> 
</VirtualHost> 

我創建了一個基本的腳本來測試$ _ SERVER內容:

echo '$_SERVER[\'HTTP_HOST\'] : ' . $_SERVER['HTTP_HOST']; 
echo '<br/>' . '$_SERVER[\'PHP_SELF\'] : ' . $_SERVER['PHP_SELF']; 
echo '<br/>' . '$_SERVER[\'REQUEST_URI\'] : ' . $_SERVER['REQUEST_URI']; 

這裏是結果:

// URL: http://localhost/ivankristianto/request.php 
$_SERVER['HTTP_HOST'] : localhost 
$_SERVER['PHP_SELF'] : /ivankristianto/request.php 
$_SERVER['REQUEST_URI'] : /ivankristianto/request.php //This is correct 

// URL: http://www.ivankristianto.local/request.php 
$_SERVER['HTTP_HOST'] : www.ivankristianto.local 
$_SERVER['PHP_SELF'] : /request.php 
$_SERVER['REQUEST_URI'] : http://www.ivankristianto.local/request.php //This is wrong 

我沒有使用任何代理,我所做的只是把它在我的/ etc/hosts中。

我花了好幾個小時才知道爲什麼會發生這種情況,並通過谷歌和本網站進行搜索,但無法找到任何線索。

你能指出我有什麼問題嗎?

謝謝。
伊萬

回答

0

我終於搞定了。
這是我做的步驟(我不知道它爲什麼會生效,但它現在正在工作)。

  1. XAMPP上安裝PHP的FastCGI,我按照此步驟:https://commaster.net/content/installing-php-fastcgi-and-zend-opcache-xampp-windows
  2. 我加載mod_fcgid,但我不使用PHP-cgi.exe文件處理程序
  3. 更新我的/ etc/hosts文件,並刷新DNS使用此命令ipconfig/FLUSHDNS
  4. 重新啓動Apache

而且它正在以某種方式。
老實說,我不知道它爲什麼工作,但如果有人遇到同樣的問題,我希望這個解決方案可能會有所幫助。

3

我相信你接收創建虛擬主機的預期效果:

沒有虛擬主機:

/ivankristianto/request.php 

隨着虛擬主機:

http://www.ivankristianto.local/request.php 

http://www.ivankristianto.local - I認爲這看起來不對,因爲它包含http://www.local - 您可以將其更改爲invankristano,並且您的REQUEST_URI將輸出與您沒有虛擬主機相同的輸出。它代表了你的request.php的路徑 - 你已經在hosts文件中設置了,因此它是URI的有效部分。

所以基本上我說的是沒有錯。

如果它導致你的問題,那麼一個解決方案將是確定你在哪個環境 - e。摹

if($_SERVER['HTTP_HOST'] == 'www.ivankristianto.local') { 
    $dev_env = TRUE; 
}else { 
    $dev_env = FALSE; 
} 

然後某處使用:

if($dev_env) { 
    $_SERVER['REQUEST_URI'] = str_replace($_SERVER['HTTP_HOST'],'',$_SERVER['REQUEST_URI']); 
} 

更新

嘗試改變主機的conf到:

<VirtualHost *:80> 
DocumentRoot "D:/HTDOCS/ivankristianto" 
ServerName ivankristianto.local 
UseCanonicalName Off 
<Directory "D:/HTDOCS/ivankristianto"> 
    Options Indexes FollowSymLinks MultiViews 
    AllowOverride all 
    Require all granted 
</Directory> 
</VirtualHost> 

(從服務器名稱去除WWW)

+0

感謝JohnnyFaldo的回答。但REQUEST_URI不應該返回完整的URL,它應該返回到這樣的:'/request.php'。基於PHP Doc:http://php.net/manual/en/reserved.variables.server.php – Ivan 2014-10-05 09:35:44

+0

這就是它正在做的事情。這就是我的觀點 - 如果您在主機文件中將其更改爲只有'ivankristianto'而沒有www,那麼您會被虛擬主機的'URL'語法搞糊塗。 &.local - 那麼它會顯得不那麼奇怪。這只是一個名稱,指的是它代表的URI在主機文件中設置的實際部分 – JohnnyFaldo 2014-10-05 09:39:35

+0

@Ivan您是否試圖刪除主機文件中的UseCanonicalName行 – JohnnyFaldo 2014-10-05 09:44:14

0

最近同樣的問題,
我的解決辦法:
首先檢查您的http://localhost有同樣的效果(這我知道我沒有)
如果沒有,那麼你添加虛擬主機(域)到/ etc/host文件。

希望這是有幫助的。

相關問題