Wie soll ich die <If> -Direktive in .htaccess verwenden?

16

Ich versuche, eine bedingte Anweisung mit der If-Direktive von Apache in meine .htaccess-Datei aufzunehmen.

Ich habe auf diese Seite http://httpd.apache.org/docs/trunk/mod/core.html#if verwiesen, aber es werden nicht viele Beispiele aufgeführt. Zwei unvollständige Beispiele sind:

<Wenn% {REQUEST_METHOD} IN GET, HEAD, OPTIONS> 

und

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

Daher habe ich versucht, Folgendes zu meiner .htaccess-Datei hinzuzufügen:

<If% {SERVER_PORT} IN GET, HEAD, OPTIONS>
   Hier ist noch nichts
</ If>

Aber ich erhalte immer wieder den Fehler 500, wenn ich versuche, die Seite zu laden. Dies ist auf meiner lokalen Installation und es hat zuvor einwandfrei funktioniert (oder wenn ich diesen Code entferne). Ich glaube, ich habe AllowOverride Allglobal eingerichtet, und der Kontext für die If-Direktive sollte in .htaccess vorhanden sein ("Kontext: Serverkonfiguration, virtueller Host, Verzeichnis, .htaccess").

Kann mir jemand einige Beispiele geben, wie man die <If> -Direktive richtig verwendet, oder eine Anleitung, warum sie bei mir nicht funktioniert?

Vielen Dank!

cwd
quelle
1
Wenn Sie einen 500-Fehler erhalten, bedeutet dies, dass Apache etwas in Ihrem Fehlerprotokoll protokolliert hat. Was sagt es? Außerdem ergibt Ihr Test für SERVER_PORTin GET,HEAD,OPTIONSkeinen Sinn ( SERVER_PORTwird die Nummer Portnummer sein, auf der die Anfrage empfangen wurde).
larsks
Danke, Larsks. Es sieht so aus, als würde ich Apache 2.0 ausführen, das die <If> -Direktive nicht unterstützt. Vielleicht muss ich ein Upgrade auf 2.3 in Betracht ziehen. Zumindest erklärt dies, warum es nirgendwo Beispiele gibt (b / c die Funktion ist so neu). Danke für den Hinweis.
KWD

Antworten:

14

<If> ist nur in Apache 2.4+ verfügbar, stellen Sie also zunächst sicher, dass Sie diese Version haben.

Beispiele

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

Alternativen zu <If>

Es gibt ein paar andere Lösungen für bedingte Anweisungen in Apache 2.2, wenn Sie immer noch daran festhalten.

  • Sie können Umgebungsvariablen festlegen über:

    • Apache-Konfiguration
    • SetEnvIf
    • mod_rewrite's RewriteMatch
  • Dann können Sie mit bedingte Anweisungen ausführen

    <IfDefine MyEnvironmentVar>
       ...
    </IfDefine>
    

Beispiel:

# 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
Simon East
quelle
1
Testen aber nicht arbeiten! In dem Dokument von Apache wird die <IfDefine>Anweisung nur beim Start analysiert, und die Anweisung kann nur parameter-namemithttpd -Dx=y
William Leung
Ihre "Alternativen zu If" haben für mich gut funktioniert, schönes Beispiel.
Kyborek