2009-04-10 4 views
15

Dies ist eine Apache-Frage, die Sie wahrscheinlich schon einmal kennengelernt haben. Ich möchte ein Quellpaket haben, das ich auf meiner Arbeitsstation, meinem Staging-Server und meinem Produktionsserver bereitstellen kann, aber dafür unterschiedliche .htaccess-Einstellungen basierend auf der URL laden muss.Wie kann ich einen bedingten .htaccess Block haben?

Bitte beachte, dass ich eine Flickschusterei mit einem IfModule-Call, aber das wird nicht mit unserem neuen Produktionsserver arbeiten, weil sie alle die gleichen Module wie mein Staging-Server teilen.

Hinweis muss ich SetEnv mit diesen Neufassungen bündeln. Derzeit, wenn Sie RewriteCond verwenden, bindet es nur an die folgende RewriteRule, aber nicht an die darunter liegende SetEnv.

Antwort

15

Anstelle der Verwendung von SetEnv, die Einstellung der Umgebungsvariablen Fähigkeiten von RewriteRule selbst verwenden:

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

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

Obwohl ich bevorzuge, diese Art von Sache zu tun, indem ich Flags zum httpd-Prozess beim Start übergebe und mit IfDefine-Blöcken nach ihnen suche.

<IfDefine FOO> 
SetEnv VARNAME foo 
</IfDefine> 

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

Es sollte beachtet werden, dass die php_value-Direktive in Apache nicht in den ersten Beispiel-Umgebungsvariablen aufgerufen werden kann. Im zweiten Beispiel ist dies die beste Wahl, da Sie Ihren Server buchstäblich definieren können. Dies funktioniert jedoch nur, wenn Sie die Umgebung steuern. Wenn Sie sich auf einem freigegebenen Host befinden, haben Sie keine Möglichkeit, die Übergabe eines Parameters an den httpd-Prozess zu steuern. Daher suchen Sie mit nach einer Umkehrung. –

+1

Ich habe festgestellt, dass ich IfDefine verwenden kann, da mein Prod-Server zu 100% von mir kontrolliert wird und ich mich mit dem Parameter/etc/sysconfig/httpd OPTION anlegen und OPTIONS = "- D prod" machen kann. Auf dem Staging-Server, der freigegeben ist, musste ich IfDefine! Prod verwenden und dann ein IfModule-expires_module darunter stapeln. Auf meiner Workstation musste ich IfDefine! Prod verwenden, gefolgt von IfModule! Expires_module. Dies gab mir eine .htaccess-Datei, die in Dev, Staging/Test und Produktion gearbeitet hat. –

+0

Etwas verwirrend, ließ mich denken, dass einfache Umgebungsvariablen auf ifdefine verwendet werden könnten – Dan

1

Hier ist ein einfaches Beispiel, das sollte genug sein, damit Sie es ändern, um Ihre Anforderungen gerecht zu werden:

<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

Does Art von seriell, dass die Arbeit, wo ich dann einen anderen RewriteCond darunter mit mehr RewriteRule Einträge anhängen, und es wird nur auf die vorherige RewriteCond gelten? Ich meine, in normalen Programmiersprachen und Markup haben Sie eine Art Start/Stop-Block, ob es nun geschweifte Klammern sind. Aber nicht hier –

+0

Auch, ist RewriteBase/wichtig? –

+0

Das Problem mit diesem Ansatz ist, dass es nur für RewriteRule funktioniert, versuchen Sie es auch für SetEnv oder php_value und es funktioniert nicht. Deshalb habe ich den IfModule-Kludge verwendet. –

5

auf Ubuntu Linux wird die IfDefine ‚s Variable in

/etc/apache2/envvars 

gesetzt und APACHE_ARGUMENTS genannt wird. Also, am Ende der Datei hatte ich hinzufügen:

export APACHE_ARGUMENTS="-D dev" 

... und dann abprallen den Server mit:

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

Auf anderen Systemen:

Allerdings gibt es ein Debian-Artikel zu diesem Thema, der dieses Thema behandelt here. In diesem Beispiel lautet die zu bearbeitende Datei/etc/default/apache2, und die Variable heißt APACHE_DEFINES.

Ebenso ist auf einigen Systemen eine Variable namens OPTIONS in /etc/sysconfig/httpd festgelegt.

Also, was Sie wirklich brauchen, ist für den Startabschnitt in Ihrer apache2ctl Datei aussehen zu tun. Also, zunächst ein whereis apache2ctl tun zu finden, wo das Skript, Katze es aus und den Startabschnitt mit der apache2 Richtlinie darin finden, und sehen, ob der Variable es geht OPTIONS ist, APACHE_ARGUMENTS, APACHE_DEFINES, oder etwas anderes. Dann sehen Sie, welche Datei Sie bearbeiten müssen, entweder mit /etc/sysconfig/httpd, /etc/default/apache2 oder /etc/apache2/envvars.

Verwandte Themen