Як я повинен використовувати директиву <If> в .htaccess?


16

Я намагаюся додати умовне твердження за допомогою директиви Apache If у моєму файлі .htaccess.

Я посилався на цю сторінку http://httpd.apache.org/docs/trunk/mod/core.html#if, але це не дуже детально / наводить багато прикладів. Два неповні приклади, які він дає:

<Якщо% {REQUEST_METHOD} В GET, HEAD, OPTIONS> 

і

<Якщо "$ req {Host} = '" "> 

Тому я спробував додати це до свого файлу .htaccess:

<If% {SERVER_PORT} В GET, HEAD, OPTIONS>
   # нічого тут ще немає
</If>

Але я продовжую отримувати помилку 500, коли я намагаюся завантажувати сторінку. Це на моїй локальній установці, і вона працювала нормально раніше (або якщо я видалю цей код). Я вважаю, що я AllowOverride Allстворив глобально, і контекст директиви If повинен нехай він присутній у .htaccess ("Контекст: конфігурація сервера, віртуальний хост, каталог, .htaccess").

Чи може хтось надати мені кілька прикладів того, як правильно використовувати директиву <If>, або якісь вказівки, чому це не працює для мене?

Спасибі!


1
Якщо ви отримуєте помилку 500, це означає, що Apache щось записав у ваш журнал помилок. Що він говорить? Крім того, ваш тест для SERVER_PORTв GET,HEAD,OPTIONSне має сенсу ( SERVER_PORTбуде номер порту номера, на який було отримано запит).
larsks

Спасибі, ларки. Схоже, я запускаю apache 2.0, який не підтримує директиву <If>. Можливо, мені потрібно вивчити оновлення до 2.3. Принаймні, це пояснює, чому прикладів ніде немає (b / c функція така нова). Дякую за пораду.
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's 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

Ваші "Альтернативи якби" добре працювали для мене, приклад.
Кіборек
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.