Come dovrei usare la direttiva <If> in .htaccess?


16

Sto cercando di aggiungere un'istruzione condizionale usando la direttiva If di Apache nel mio file .htaccess.

Ho fatto riferimento a questa pagina http://httpd.apache.org/docs/trunk/mod/core.html#if ma non elabora molto / fornisce molti esempi. Due esempi incompleti che fornisce sono:

<Se% {REQUEST_METHOD} IN OTTIENI, TESTA, OPZIONI> 

e

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

Quindi ho provato ad aggiungere questo al mio file .htaccess:

<Se% {SERVER_PORT} IN OTTIENI, TESTA, OPZIONI>
   #nulla ancora qui
</ Se>

Ma continuo a ricevere l' errore 500 quando provo a caricare la pagina. Questo è sulla mia installazione locale e funzionava bene in precedenza (o se rimuovo quel codice). Credo di aver AllowOverride Allimpostato a livello globale e il contesto per la direttiva If dovrebbe lasciarlo presente in .htaccess ("Contesto: configurazione del server, host virtuale, directory, .htaccess").

Qualcuno può darmi alcuni esempi su come utilizzare correttamente la direttiva <If> o alcune indicazioni sul perché non funziona per me?

Grazie!


1
Se ricevi un errore 500, significa che Apache ha registrato qualcosa nel tuo registro errori. Cosa dice? Inoltre, il test per SERVER_PORTin GET,HEAD,OPTIONSnon ha alcun senso ( SERVER_PORTsarà il numero di porta del numero su cui è stata ricevuta la richiesta).
Larsks,

Grazie, Larry. Sembra che sto eseguendo apache 2.0 che non supporta la direttiva <If>. Forse dovrei esaminare l'aggiornamento a 2.3. Almeno questo spiega perché non ci sono esempi da nessuna parte (b / c la funzionalità è così nuova). Grazie per il consiglio.
Cwd,

Risposte:



16

<If> è disponibile solo in Apache 2.4+, quindi assicurati innanzitutto di avere quella versione.

Esempi

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

Alternative a <If>

Ci sono alcune altre soluzioni per fare istruzioni condizionali in Apache 2.2 se sei ancora bloccato con quello.

  • È possibile impostare le variabili di ambiente tramite:

    • Configurazione di Apache
    • SetEnvIf
    • di mod_rewrite RewriteMatch
  • Quindi è possibile eseguire istruzioni condizionali utilizzando

    <IfDefine MyEnvironmentVar>
       ...
    </IfDefine>
    

Esempio:

# 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
Prova ma non funziona! nel documento di apache, la <IfDefine>direttiva analizza solo all'avvio e parameter-namepuò essere solo passata dal comando promp usandohttpd -Dx=y
William Leung

Le tue "Alternative a If" funzionavano bene per me, bell'esempio.
Kyborek,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.