Как мне использовать директиву <If> в .htaccess?

16

Я пытаюсь добавить условный оператор, используя директиву Apache If в моем файле .htaccess.

Я ссылался на эту страницу http://httpd.apache.org/docs/trunk/mod/core.html#if, но она не очень детализирована / приводит много примеров. Это два неполных примера:

<If% {REQUEST_METHOD} В GET, HEAD, OPTIONS> 

и

<If "$ req {Host} = ''"> 

Поэтому я попытался добавить это в мой файл .htaccess:

<If% {SERVER_PORT} В GET, HEAD, OPTIONS>
   # здесь пока ничего
</ If>

Но я продолжаю получать ошибку 500, когда я пытаюсь загрузить страницу. Это на моей локальной установке, и раньше она работала нормально (или если я удалю этот код). Я полагаю, что я AllowOverride Allнастроил глобально, и контекст для директивы If должен позволять ей присутствовать в .htaccess («Контекст: конфигурация сервера, виртуальный хост, каталог, .htaccess»).

Может ли кто-нибудь дать мне несколько примеров того, как правильно использовать директиву <If>, или несколько советов относительно того, почему она не работает для меня?

Благодарность!

УХО
источник
1
Если вы получаете ошибку 500, это означает, что Apache записал что-то в ваш журнал ошибок. Что это говорит? Кроме того, ваш тест для SERVER_PORTin GET,HEAD,OPTIONSне имеет никакого смысла ( SERVER_PORTэто будет номер порта порта, на который был получен запрос).
Жаворонки
Спасибо, жаворонки. Похоже, я использую Apache 2.0, который не поддерживает директиву <If>. Может быть, мне нужно посмотреть на обновление до 2.3. По крайней мере, это объясняет, почему нигде нет примеров (т.к. эта функция настолько нова). Спасибо за совет.
cwd

Ответы:

16

<If> доступно только в Apache 2.4+, поэтому сначала убедитесь, что у вас есть эта версия.

Примеры

# Compare the host name to example.com and redirect to www.example.com if it matches
<If "%{HTTP_HOST} == 'example.com'">
  Redirect permanent "/" "http://www.example.com/"
</If>

<If "%{HTTP_HOST} =~ /regex/">
  SecFilterEngine Off
  SecFilterScanPOST Off
</If>

<If "%{REQUEST_URI} =~ m#/regex/including/slashes/#">
  SecFilterEngine Off
  SecFilterScanPOST Off
</If>

Альтернативы <If>

Есть несколько других решений для выполнения условных операторов в Apache 2.2, если вы все еще застряли с этим.

  • Вы можете установить переменные окружения через:

    • Конфигурация Apache
    • SetEnvIf
    • mod_rewrite-х RewriteMatch
  • Затем вы можете выполнить условные операторы, используя

    <IfDefine MyEnvironmentVar>
       ...
    </IfDefine>
    

Пример:

# Set environment variable if we're on staging site
SetEnvIf Host staging ROBOTS_NOINDEX

# Set environment variable if we're within a specific folder
SetEnvIf Request_URI ^/app/webroot/files/ ROBOTS_NOINDEX

# Send custom header if environment variable is set
Header set X-Robots-Tag "noindex" ENV=ROBOTS_NOINDEX
Саймон Ист
источник
1
Тест, но не работа! в документе из apache <IfDefine>директива только анализирует при запуске, и parameter-nameтолько команда может проходить по командной строке, используяhttpd -Dx=y
William Leung
Ваши "Альтернативы если" работали нормально для меня, хороший пример.
Киборек