Назад | Перейти на главную страницу

Кажется, не удается заставить mod_rewrite установить переменную среды

Это просто странно.

Я добавил следующее в .htaccess файл:

RewriteRule ^a-file-on-the-server$ index.php [E=let_me_in:test]

И в моем PHP-скрипте у меня есть следующее:

print_r($_ENV);

... который распечатывает все переменные среды.

Когда я иду в mydomain.com/a-file-on-the-server, Я получаю вывод:

Array
(
    [DOCUMENT_ROOT] => ********
    [GATEWAY_INTERFACE] => CGI/1.1
    [HTTP_ACCEPT] => application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
    [HTTP_ACCEPT_CHARSET] => ISO-8859-1,utf-8;q=0.7,*;q=0.3
    [HTTP_ACCEPT_ENCODING] => gzip,deflate,sdch
    [HTTP_ACCEPT_LANGUAGE] => en-US,en;q=0.8
    [HTTP_CACHE_CONTROL] => max-age=0
    [HTTP_CONNECTION] => keep-alive
    [HTTP_COOKIE] => ********
    [HTTP_HOST] => ********
    [HTTP_USER_AGENT] => Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/533.4 (KHTML, like Gecko) Chrome/5.0.375.99 Safari/533.4
    [PATH] => /bin:/usr/bin
    [QUERY_STRING] => 
    [REDIRECT_STATUS] => 200
    [REMOTE_ADDR] => ********
    [REMOTE_PORT] => 36345
    [REQUEST_METHOD] => GET
    [REQUEST_URI] => ********
    [SCRIPT_FILENAME] => ********
    [SCRIPT_NAME] => ********
    [SERVER_ADDR] => ********
    [SERVER_ADMIN] => ********
    [SERVER_NAME] => ********
    [SERVER_PORT] => 80
    [SERVER_PROTOCOL] => HTTP/1.1
    [SERVER_SIGNATURE] => 
    [SERVER_SOFTWARE] => Apache
    [UNIQUE_ID] => ********
)

Как видите, переменная среды не отображается. Что я делаю не так?

Единственное, что выглядит неправильно, - это используемое вами регулярное выражение. Помните, что регулярное выражение соответствует всему URI запроса, который всегда начинается с /. То, как вы это написали, будет соответствовать только в том случае, если запрос начинается с a-file... чего никогда не будет.

Попробуйте использовать это вместо этого (я только добавил / после ^):

RewriteRule ^/a-file-on-the-server$ index.php [E=let_me_in:test]

Могут быть и другие части вашего правила, которые не подходят, но у меня нет большого опыта работы с переменными окружения.

Я столкнулся с этой проблемой сегодня, выполняя некоторую работу с Apache mod_rewrite. Проблема в том, что PHP помещает переменную среды, определенную как часть правила перезаписи, в $ _SERVER, а не в $ _ENV (и изменяет имя переменной env).

Включая RewriteRule, например

RewriteRule ^a-file-on-the-server$ index.php [E=let_me_in:test]

в моей настройке (CentOS6 с Apache 2.2.15 и PHP 5.3.3) будет предоставлять переменную как $ _SERVER ['REDIRECT_LET_ME_IN'], так что index.php с содержимым:

<?php
   print_r($_SERVER['REDIRECT_LET_ME_IN']);
?>

отобразит текст:

test

Я использовал вызов функции phpinfo (), чтобы исследовать эту проблему и рекомендовать ее для просмотра всех доступных пар ключ / значение $ _ENV и $ _SERVER во время отладки.

эй, я провожу тест, и при установке env var,

Я делаю то, что вам нравится [E = переменная: значение, другой флаг / значение, (..)]

и в моем файле php я вижу эти настройки НДС в $ _SERVER ['variable']

вы можете захотеть получить свой var вот так:

эхо $ _SERVER ['let_me_in'];

выходной тест.