2009-04-10 3 views
15

Questa è una domanda su Apache che probabilmente hai già incontrato. Voglio avere un pacchetto sorgente che posso distribuire sulla mia workstation, sul mio server di staging e sul mio server di produzione, ma per caricare diverse impostazioni .htaccess in base all'URL.Come posso avere un blocco .htaccess condizionale?

Nota che stavo usando un kludge con una chiamata IfModule, ma che non funzionerà con il nostro nuovo server di produzione perché condivide tutti gli stessi moduli del mio server di staging.

Nota Ho bisogno di raggruppare SetEnv con queste riscritture. Attualmente se usi RewriteCond, si lega solo alla seguente RewriteRule, ma non al SetEnv sottostante.

risposta

15

Invece di usare SetEnv, utilizzare le funzioni di regolazione variabile d'ambiente di RewriteRule stesso:

RewriteCond %{HTTP_HOST} =foo.com 
RewriteRule^- [E=VARNAME:foo] 

RewriteCond %{HTTP_HOST} =bar.com 
RewriteRule^- [E=VARNAME:bar] 

Anche se preferisco fare questo genere di cose passando i flag al processo httpd all'avvio e cercandoli usando i blocchi IfDefine.

<IfDefine FOO> 
SetEnv VARNAME foo 
</IfDefine> 

<IfDefine BAR> 
SetEnv VARNAME bar 
</IfDefine> 
+0

Va notato che la direttiva php_value in Apache non può essere chiamata nel primo esempio: solo le variabili di ambiente. Nel secondo esempio, questa è la scelta migliore perché puoi letteralmente definire il tuo server. Tuttavia, questo funziona solo se controlli l'ambiente. Se si è su un host condiviso, non è possibile controllare il passaggio di un parametro al processo httpd. Pertanto, si cerca inverso di questo con . –

+1

Ho scoperto che posso usare IfDefine perché il mio server prod è controllato al 100% da me e posso pasticciare con il parametro/etc/sysconfig/httpd OPTION e renderlo OPTIONS = "- D prod". Sul server di staging, che è condiviso, ho dovuto usare IfDefine! Prod e quindi impilare un IfModule expires_module sotto di esso. Sulla mia workstation, ho dovuto usare IfDefine! Prod seguito da IfModule! Expires_module. Questo mi ha dato un file .htaccess che funzionava in dev, staging/test e produzione. –

+0

Un po 'di confusione, mi ha fatto pensare che semplici variabili ambientali potevano essere usate su ifdefine – Dan

1

Ecco un semplice esempio che dovrebbe essere sufficiente per voi per cambiare per soddisfare le vostre esigenze:

<IfModule mod_rewrite.c> 
    RewriteEngine On 

    RewriteBase/

    RewriteCond %{HTTP_HOST} !^localhost 
    RewriteCond %{HTTP_HOST} !^www\. 
    RewriteRule (.*) http://www.%{HTTP_HOST}/$1 [R=301,L] 
</IfModule> 
+0

Funziona in modo seriale, dove posso quindi aggiungere un altro RewriteCond sotto di esso con più voci RewriteRule e si applica solo al precedente RewriteCond? Voglio dire, nei normali linguaggi di programmazione e nel markup si ha una sorta di blocco start/stop, che si tratti di parentesi graffe. Ma non qui –

+0

Inoltre, è RewriteBase/importante? –

+0

Il problema con questo approccio è che funziona solo con RewriteRule, prova e lo usa anche per SetEnv o php_value e non funziona. Ecco perché ho usato l'ifModule kludge. –

5

Su Ubuntu Linux, variabile s' il IfDefine si trova in

/etc/apache2/envvars 

e si chiama APACHE_ARGUMENTS. Quindi, in fondo a quel file ho dovuto aggiungere:

export APACHE_ARGUMENTS="-D dev" 

... e poi rimbalzare il server con:

/etc/init.d/apache2 stop 
/etc/init.d/apache2 start 

Su altri sistemi:

Tuttavia, non c'è un articolo Debian su questo argomento che discute questo here. In questo esempio, il file da modificare è/etc/default/apache2 e la variabile è chiamata APACHE_DEFINES.

Allo stesso modo, su alcuni sistemi è una variabile denominata OPTIONS impostata in /etc/sysconfig/httpd.

Quindi, quello che devi veramente fare è cercare la sezione di avvio nel tuo file apache2ctl. Quindi, inizia con uno whereis apache2ctl per trovare dove si trova lo script, sfogliatelo e trova la sezione di avvio con la direttiva apache2 al suo interno e verifica se la variabile che passa è OPTIONS, APACHE_ARGUMENTS, APACHE_DEFINES o altro. Quindi, vedere quale file è necessario modificare sperimentando con /etc/sysconfig/httpd, /etc/default/apache2 o /etc/apache2/envvars.