Apache URL переписывает себя плохо - PullRequest
0 голосов
/ 27 января 2012

У меня есть настройки ниже;очень простая настройка перезаписи 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() страница отображается, как и ожидалось, если я добавлю косую черту в информацию о пути, это тоже работает.Но если я добавлю закодированную косую черту %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).

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

1 Ответ

0 голосов
/ 31 января 2012

Из-за версии 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>
...