我怎样才能有一个有条件的.htaccess块?

这是你之前可能遇到的一个Apache问题。 我希望有一个可以部署到我的工作站,登台服务器和生产服务器的源代码包,但要根据URL的内容加载不同的.htaccess设置。

请注意,我正在使用一个带有IfModule调用的kludge,但是这不适用于我们的新的生产服务器,因为它与我的登台服务器共享所有相同的模块。

注意我需要捆绑SetEnv与这些重写。 目前,如果您使用RewriteCond,它只绑定到下面的RewriteRule,而不是下面的SetEnv。

而不是使用SetEnv,使用RewriteRule本身的环境变量设置功能:

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

虽然我更喜欢在启动时将标志传递给httpd进程,并使用IfDefine块来查找它们。

 <IfDefine FOO> SetEnv VARNAME foo </IfDefine> <IfDefine BAR> SetEnv VARNAME bar </IfDefine> 

在Ubuntu Linux上IfDefine的变量被设置为

 /etc/apache2/envvars 

并称为APACHE_ARGUMENTS 。 所以,在该文件的底部,我不得不补充:

 export APACHE_ARGUMENTS="-D dev" 

…然后弹出服务器:

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

在其他系统上:

但是,这里有一个关于这个主题的Debian文章。 在这个例子中,要编辑的文件是/ etc / default / apache2,变量名为APACHE_DEFINES

同样,在某些系统上,它是一个名为OPTIONS的变量,它在/etc/sysconfig/httpd

所以,你真正需要做的是在你的apache2ctl文件中寻找开始部分。 因此,首先通过whereis apache2ctl来查找脚本的位置,然后找出其中的开始部分,并查看它所传递的变量是OPTIONSAPACHE_ARGUMENTSAPACHE_DEFINES还是别的。 然后,通过对/etc/sysconfig/httpd/etc/default/apache2/etc/apache2/envvars实验来查看需要编辑哪个文件。

这是一个简单的例子,应该足以让你改变它来满足你的要求:

 <Ifmodulee mod_rewrite.c> RewriteEngine On RewriteBase / RewriteCond %{HTTP_HOST} !^localhost RewriteCond %{HTTP_HOST} !^www\. RewriteRule (.*) http://www.%{HTTP_HOST}/$1 [R=301,L] </Ifmodulee>