2012-01-27 26 views
0

我有以下設置;一個非常簡單的URL重寫設置與測試設置Apache URL重寫行爲不端

// ----- test.php ----- 
<?php 

phpinfo(); 
// ----- test.php ----- 

test.local的配置如下。

<VirtualHost *:80> 
     ServerName test 
     ServerAlias test.* 
     DocumentRoot /var/www/test 
</VirtualHost> 

<Directory "/var/www/test/"> 
     RewriteEngine On 
     RewriteBase/
     RewriteCond %{REQUEST_FILENAME} !-f 
     RewriteCond %{REQUEST_FILENAME} !-d 
     RewriteRule .* test.php/$0 [R,NE] 
</Directory> 

現在,如果我提出請求GET http://test.local/my-path-info默認的預期,如果我的路徑信息,該作品也添加斜線出現phpinfo()頁面。但是如果我在URL中添加一個編碼的正斜槓%2F(例如GET http://test.local/my-path-info%2fsomething-else),它會以404 Not found的形式出現。基本上它不會到達php文件。

任何想法爲什麼會發生這種情況,以及如何解決它?

該設置位於Apache 2.2.13,Linux(CentOS 5.x)上的PHP 5.3.8。

注意:我在這裏要做的是將正斜槓添加到其中一個路徑信息組件中,這樣它就不會被MVC框架中的路由器邏輯解釋。如果不對其進行編碼,則路由器不能區分作爲路徑分隔符的斜槓和作爲路徑組件的一部分的斜槓。

+2

這可以幫助:http://stackoverflow.com/questions/3235219/urlencoded-forward-slash-is-breaking-url – 2012-01-27 15:14:48

+0

難道你想被你指令在你的身體這不成爲Apache全球指令? – Skittles 2012-01-29 03:16:18

+0

謝謝@Skittles你是絕對正確的;但同時它是正確的配置,特定於我的設置。 – 2012-01-31 15:59:54

回答

0

因爲這並不支持NoDecode作爲一個選項,AllowEncodedSlashes Apache的版本,我結束了使用下面的組合。我還必須對請求URI進行url編碼。不理想但暫時適合我。

<VirtualHost *:80> 
     ServerName test 
     ServerAlias test.* 
     DocumentRoot /var/www/test 
     AllowEncodedSlashes On 
</VirtualHost> 

<Directory "/var/www/test/"> 
     RewriteEngine On 
     RewriteBase/
     RewriteCond %{REQUEST_FILENAME} !-f 
     RewriteCond %{REQUEST_FILENAME} !-d 

     # Option B below was the key! 
     RewriteRule .* test.php/$0 [R,NE,B] 
</Directory>