Может ли htaccess прочитать переменную окружения сервера, установленную в Apache?
Когда вы устанавливаете переменную окружения сервера в настройках Apache, можно прочитать эту переменную из PHP с помощью встроенных функций.
Но можете ли вы прочитать переменную из файла htaccess?
То, что я пытаюсь выполнить в моем htaccess, - это что-то вроде:
<If var=="stuff">
do things here
</if>
<if var=="different stuff">
do different things here
</if>
Ответы
Ответ 1
Да, это так.
Вероятно, вы захотите использовать функциональность mod_setenvif, чтобы модуль нужно было включить.
Затем вы просто делаете что-то вроде:
SetEnvIf Request_URI "\.gif$" image_type=gif
Что бы установить переменную окружения image_type
со значением gif
, если запрошенное имя файла заканчивается на .gif
.
Затем вы можете получить доступ к этому (например, в RewriteCond) следующим образом:
RewriteCond %{ENV:image_type} gif
RewriteRule ^(.*) $.gif
Здесь вы можете прочитать полную документацию: http://httpd.apache.org/docs/2.2/env.html
Ответ 2
Поскольку у меня было много проблем с настройкой аналогичной вещи, чтобы распознать мой домашний локальный хост, отличный от моей работы, вот что я в итоге сделал.
В первую очередь, директива <IF ..>
не распознает SetEnv. Из http://httpd.apache.org/docs/current/env.html: "Директива SetEnv работает поздно во время обработки запроса, что означает, что директивы, такие как SetEnvIf и RewriteCond, не будут видеть переменные, установленные вместе с ним."
Итак, попробуйте использовать SetEnvIf, если сможете. Я был ленив и просто поместил это в свой файл httpd.conf. Он проверяет, что он работает на localhost - который, очевидно, есть, - затем устанавливает переменную:
SetEnvIf Server_Addr ^127\.0\.0\.1$ home_variable
Затем, в другом месте, в моем файле htaccess у меня было следующее:
# IfVersion needs mod_version - you could do an ifmodule before all this i guess
# we use ifversion because If was introduced in apache 2.4
<IfVersion >= 2.4>
# check if the home variable exists/isn't: empty, "0", "off", "false", or "no"
<If "-T reqenv('home_variable')">
... do home-y stuff
</If>
<Else>
... do work-y stuff
</Else>
</IfVersion>
# fallback
<IfVersion < 2.4>
.. fallback?
</IfVersion>
В качестве альтернативы вы можете просто иметь одну переменную для каждой среды и дать ей определенное значение:
SetEnvIf Server_Addr ^127\.0\.0\.1$ check_location=home
Тогда остальное будет таким же, кроме первого предложения <If ..>
:
<If "%{ENV:check_location} == 'home'">....</If>
Я тестировал оба из них между домашней средой с 2.4 и рабочей средой с 2.2, оба из которых включали mod_version (следовательно, не беспокоиться с ifmod).
(Я также не тестировал более двух сред, но Apache 2.4 дает <ElseIf>
, так что также вариант).
Doop di do.
(Подробнее о -T operator et al: http://httpd.apache.org/docs/current/expr.html)
Ответ 3
Apache 2.4 представил <If>
, <Else>
, <ElseIf>
блоки в сочетании с новым синтаксисом выражений для более мощного программного управления в файлах .htaccess и т.д.
Это непроверено, но якобы работает:
<If "%{MY_VAR} == 'my result'">
…
</If>
Источник: https://blogs.apache.org/httpd/entry/new_in_httpd_2_4
Ответ 4
Я дал описание и .htaccess и примеры PHP здесь: Установить переменную среды в .htaccess и получить ее в PHP
Для некоторых примеров из .htaccess, взятых из моего изменения скоростного скоростного 5G Blacklist/Firewall http://perishablepress.com/5g-blacklist-2013/, чтобы использовать отчет переменных среды
SetEnv myServerName %{SERVER_NAME}
RewriteCond %{QUERY_STRING} (base64_encode|localhost|mosconfig|open_basedir) [NC,OR]
RewriteCond %{QUERY_STRING} (boot\.ini|echo.*kae|etc/passwd) [NC,OR]
RewriteCond %{QUERY_STRING} (GLOBALS|REQUEST)(=|\[|%) [NC]
RewriteRule .* - [E=badQueryString:%0--%1--%2,F,L]
SetEnvIfNoCase User-Agent ^$ noUserAgent
SetEnvIfNoCase User-Agent (binlar|casper|cmsworldmap|comodo|diavol|dotbot|feedfinder|flicky|ia_archiver|jakarta|kmccrew|nutch|planetwork|purebot|pycurl|skygrid|sucker|turnit|vikspider|zmeu) badUserAgent=$1
<limit GET POST PUT>
Order Allow,Deny
Allow from all
Deny from env=badUserAgent
</limit>
Обратите внимание на использование параметров. % 0 дает полную строку,% 1 дает совпадение с 1-м заключенным в скобки выражением,% 2 - вторым. Дефисы являются буквальными символами отображения, чтобы визуально отделяться (не думайте, что это способ разместить пробелы там).