Подтвердить что ты не робот

Может ли htaccess прочитать переменную окружения сервера, установленную в Apache?

Когда вы устанавливаете переменную окружения сервера в настройках Apache, можно прочитать эту переменную из PHP с помощью встроенных функций.

Но можете ли вы прочитать переменную из файла htaccess?

То, что я пытаюсь выполнить в моем htaccess, - это что-то вроде:

<If var=="stuff">
do things here
</if>

<if var=="different stuff">
do different things here
</if>
4b9b3361

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