2012-07-06 29 views
0

所以,我正在玩一個PHP的應用程序,我正在建設。Apache/PHP的URL解析問題

我正在使用mod_rewrite使用.htaccess。這裏是什麼樣子:

<IfModule mod_rewrite.c> 
    RewriteEngine On 
    RewriteBase/

    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteCond %{REQUEST_FILENAME} !-d 
    RewriteRule (.*) index.php/$1 
</IfModule> 

我想如果一個URL是這樣寫的下面:

http://localdomain.com/controller 

我所期望的「控制器」沒有問題爲$ _ SERVER [「PATH_INFO」的部分結束]。然而,在Ubuntu 12.04運行的Apache 2.2.22我收到404 Not Found錯誤,而不是:

NOT FOUND 
The requested URL /index.php/controller was not found on this server. 

看來,「控制器」是繼index.php的斜線後被妥善解決,但沒有人有任何想法爲什麼我得到404而不是預期的迴應?

最終,我試圖捕獲'控制器'在我正在構建的MVC框架中使用。

在這種情況下,我有一個非常簡單的index.php,只有以下幾點:

<?php 
echo $_SERVER['PATH_INFO']; 

然而,我仍然得到而不是預期的路徑信息404錯誤。

注意:只要http://localdomain.com/http://localdomain.com/index.php工作完美。 mod_rewrite打開並正在工作,並且AllowOverride被設置爲All。

回答

2

如果你正在運行apache 2.2.22,那麼你的PHP代碼現在負責處理如果找到了控制器功能,則定義200響應。

Apache 2.2.22似乎採取了與2.2.14相比改寫的不同理念。長話短說,但它是有道理的。它假定如果你正在像CodeIgniter那樣重寫到前端控制器,那麼PHP代碼負責決定是否找到請求的URI。 Apache等待PHP代碼發送頭('HTTP/1.1 200 OK'),如果沒有,它會發送頭('HTTP/1.1 404 Not Found')。

有趣的是,來自您的控制器的實際內容也可能在響應主體中發送。但許多HTTP客戶端忽略瞭如果響應代碼是404(如MSIE,wget等)

簡短版本是apache 2.2.14(在鉑金上)是樂觀的,假設爲200,除非PHP另有指定,而apache 2.2.22是pesimistic,假設404,除非PHP另有規定。

因此,在你的代碼的某個地方,你必須把:

header('HTTP/1.1 200 OK'); 

這應該放在剛過前端控制器已確定的URI是有效的,一類和方法存在並且可以調用這個URI,但在實際調用類和方法之前。

在笨2.1.3,它看起來像這樣:

// Added this line for Apache 2.2.22 
header('HTTP/1.0 200 OK'); 
// Call the requested method. 
// Any URI segments present (besides the class/function) will be passed to the method for convenience 
call_user_func_array(array(&$CI, $method), array_slice($URI->rsegments, 2)); 
0

這裏是我創建並使用我的MVC的的.htaccess:

# Mod Rewrite 
<IfModule mod_rewrite.c> 
    RewriteEngine On 

    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteCond %{REQUEST_FILENAME} !-d 

    RewriteRule ^(.*)$   /root/index.php/$1 [PT,L] 
</IfModule> 

嘗試添加^$ +的[PT,L]

+0

這似乎並沒有幫助。我仍然得到了相同的404。就好像Apache不允許重寫工作一樣,但我已經測試過了。 – 2012-07-06 19:57:52

+0

你在'httpd.conf'裏面有'AllowOverride All'命令嗎?你有'mod_rewrite'安裝?這不是'.htaccess'文件的錯誤,因爲我知道我的工作正常。問題出在Apache2或其他地方,而不是文件。 – 2012-07-06 19:58:59

+0

這很奇怪,所以這就是我在這裏發佈問題的原因。是的,AllowOverride設置爲All並且mod_rewrite也被安裝。在運行CakePHP或Zend Framework的問題中,我在開發環境中安裝了許多其他站點,並且它們都正常工作。我知道我必須失去一些東西。 – 2012-07-06 20:03:38

0

如果你期待的URL,而不該指數將被改寫那麼只需使用:

RewriteRule ^(.*)$ index.php [NC,L]