мод переписать THE_REQUEST и (REQUEST_URI или REQUEST_FILE) дать разные имена файлов - почему? - PullRequest
7 голосов
/ 15 мая 2011

Я экспериментировал с мод-перезаписью. Я думал, что я хотел, было просто, но я не получаю URI запрошенного файла через REQUEST_URI. Скорее доставленное имя передается.

руководство говорит:

THE_REQUEST

Полный HTTP-запрос строка, отправленная браузером на сервер (например, «GET /index.html HTTP / 1.1»). Это не включает в себя какие-либо дополнительные Заголовки отправляются браузером. это значение не было сохранено (декодированный), в отличие от большинства других переменных ниже.

REQUEST_URI

Запрошенный ресурс в строке HTTP-запроса. (В пример выше, это было бы «/index.html".)

Однако эти два дают разные имена файлов в моих тестах. У меня есть bootstrap.php, через который я хотел отправить все запросы. Это тестовый файл:

<?php
echo $_GET['requestedURI'];
?>

в файле .htaccess, который у меня есть:

### REWRITE RULES ###
RewriteEngine on
RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .+ bootstrap.php?requestedURI=%{REQUEST_URI} [L]

Запрос http://localhost/test.htm выводит: / bootstrap.php

если я добавлю THE_REQUEST вместо REQUEST_URI в .htaccess, я получу GET /test.htm HTTP / 1.1

Так почему бы не согласиться на THE_REQUEST? Ну, как только строка запроса существует, вещи ломаются. Если я запрашиваю: http://localhost/test.htm?x=1&y=2, я получаю GET /test.htm?x=1, первый амперсанд разбивает вещи. Я думаю, что должна быть возможность заменить все амперсанды в строке запроса на% 26, чтобы это работало, но мне пока не удалось ...

Так может ли кто-нибудь сказать, почему не удается выполнить REQUEST_URI и как это исправить или как переписать амперсанды в% 26 в строке запроса?

Спасибо.

РЕДАКТИРОВАТЬ: Приведенный выше отчет относится к xampp 1.7.3 на Win 7. Тем временем я попробовал его на рабочей системе Linux, и там REQUEST_URI возвращает то, что должно.

Ответы [ 2 ]

3 голосов
/ 15 мая 2011

Вам не нужно явно передавать запрошенный путь URI и запрос, поскольку вы можете получить к нему доступ в PHP через $_SERVER['REQUEST_URI'].Таким образом, этого должно быть достаточно:

RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .+ bootstrap.php
2 голосов
/ 15 мая 2011

Я немного осмотрелся и не нашел хорошего объяснения, почему %{REQUEST_URI} ведет себя так, как в вашем примере.Наиболее распространенный способ добиться того, что вы ищете, это обратные ссылки:

RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)$ bootstrap.php?requestedURI=$1 [L]

Редактировать

На основании вашего комментария это выглядит как REQUEST_URI иREQUEST_FILENAME обновляются и переоцениваются при запуске rewriterule.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...