Jak korzystać z dyrektywy <If> w .htaccess?


16

Próbuję dodać instrukcję warunkową za pomocą dyrektywy If Apache w moim pliku .htaccess.

Odwoływałem się do tej strony http://httpd.apache.org/docs/trunk/mod/core.html#if, ale nie wyjaśnia zbyt wiele / podaje wiele przykładów. Dwa niekompletne przykłady, które podaje:

<Jeśli% {REQUEST_METHOD} W GET, HEAD, OPTIONS> 

i

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

Próbowałem więc dodać to do mojego pliku .htaccess:

<Jeśli% {SERVER_PORT} W GET, HEAD, OPCJE>
   # nic tu jeszcze nie ma
</If>

Ale ciągle pojawia się błąd 500, gdy próbuję załadować stronę. To jest moja lokalna instalacja i wcześniej działała dobrze (lub jeśli usunę ten kod). Wydaje mi się, że AllowOverride Allskonfigurowałem globalnie, a kontekst dyrektywy If powinien pozwolić na jej obecność w .htaccess („Kontekst: konfiguracja serwera, host wirtualny, katalog, .htaccess”).

Czy ktoś może podać mi przykłady prawidłowego korzystania z dyrektywy <If> lub wskazówki, dlaczego nie działa ona dla mnie?

Dzięki!


1
Jeśli pojawia się błąd 500, oznacza to, że Apache zarejestrował coś w dzienniku błędów. Co to mówi? Również Twój test SERVER_PORTw GET,HEAD,OPTIONSnie ma żadnego sensu ( SERVER_PORTbędzie numer portu, numer, w którym wniosek został przyjęty).
larsks

Dzięki, Larci. Wygląda na to, że korzystam z Apache 2.0, który nie obsługuje dyrektywy <If>. Może muszę rozważyć aktualizację do wersji 2.3. Przynajmniej wyjaśnia to, dlaczego nigdzie nie ma przykładów (b / c ta funkcja jest tak nowa). Dzięki za radę.
cwd

Odpowiedzi:



16

<If> jest dostępna tylko w Apache 2.4+, więc najpierw upewnij się, że masz tę wersję.

Przykłady

# 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>

Alternatywy dla <If>

Istnieje kilka innych rozwiązań wykonywania instrukcji warunkowych w Apache 2.2, jeśli nadal masz z tym problem.

  • Możesz ustawić zmienne środowiskowe poprzez:

    • Konfiguracja Apache
    • SetEnvIf
    • mod_rewrite's RewriteMatch
  • Następnie możesz wykonać instrukcje warunkowe za pomocą

    <IfDefine MyEnvironmentVar>
       ...
    </IfDefine>
    

Przykład:

# 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
Testuj, ale nie działa! w dokumencie z apache, <IfDefine>dyrektywa parsuje tylko przy starcie i parameter-namemoże przekazać tylko wiersz polecenia używająchttpd -Dx=y
William Leung

Twój „Alternatywy dla If” działał dla mnie dobrze, dobry przykład.
Kyborek,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.