这是您以前可能遇到过的 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
's 变量设置在
/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 文件中寻找开始部分。因此,首先执行 awhereis apache2ctl
来查找该脚本的位置,找出它并找到其中包含 apache2 指令的起始部分,并查看它传递的变量是OPTIONS
、APACHE_ARGUMENTS
、APACHE_DEFINES
还是其他内容。然后,通过使用/etc/sysconfig/httpd
、/etc/default/apache2
或/etc/apache2/envvars
.
我尝试了该IfDefine
方法,但它不起作用,即使我传递给 Apache 启动的定义变量肯定会出现phpinfo()
在行APACHE_ARGUMENTS
中。
我尝试了另一种方法,效果很好。在您的.htaccess
文件中,您需要以下内容:
# Is the domain local (i wanted to check two names)?
<If "%{SERVER_NAME} != 'localhost' && %{SERVER_NAME} != 'myproject.localhost'">
# I wanted to password protect the production server only
AuthType Basic
AuthName "Restricted area"
AuthUserFile /app/.htpasswd
require valid-user
</If>
我正在使用 Apache 2.4。可能不适用于早期版本。
这是一个简单的示例,应该足以让您对其进行更改以满足您的要求:
<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>