2012-01-27 4 views
0

У меня есть настройка ниже; очень простая настройка перезаписи URL-адресов с установочной установкойURL-адрес Apache Rewriting misbehaving

// ----- 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() страница, как и ожидалось, если добавить косую черту в информации пути, который работает тоже. Но если я добавлю кодовую косую черту %2F в URL-адрес (пример GET http://test.local/my-path-info%2fsomething-else), она появится как 404 Not found. В принципе, он не попадает в файл php.

Любая идея, почему это происходит, и как обойти ее?

Настройка на Apache 2.2.13, PHP 5.3.8 на Linux (Centos 5.x).

ПРИМЕЧАНИЕ. То, что я пытаюсь сделать, это добавить косую черту в один из компонентов информации о пути, чтобы он не интерпретировался логикой маршрутизатора в рамках MVC. Без кодирования маршрутизатор не может различать косой чертой, которая является разделителем путей, и той, которая является частью компонента пути.

+2

Это может помочь: http://stackoverflow.com/questions/3235219/urlencoded-forward-slash-is-breaking-url –

+0

Вы бы не быть желания ваших директив в вашем тела для этого не стать глобальной директивой Apache? – Skittles

+0

Спасибо @Skittles, что вы абсолютно правы; но в то же время это правильная конфигурация, характерная для моей настройки. –

ответ

0

Из-за версии apache, которая не поддерживает NoDecode в качестве опции для AllowEncodedSlashes, я закончил использовать нижеследующую комбинацию. Мне также пришлось удвоить url-кодирование URI запроса. Не идеально, но работает для меня на данный момент.

<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>