这是一个你可能遇到过的Apache问题。我希望有一个源代码包,可以部署到我的工作站、预备服务器和生产服务器上,但根据URL加载不同的.htaccess设置。
请注意,我曾经使用IfModule调用来解决这个问题,但这在我们的新生产服务器上行不通,因为它与我的预备服务器共享了所有相同的模块。
请注意,我需要将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>
IfDefine
的变量是在中设置的。/etc/apache2/envvars
它被称为APACHE_ARGUMENTS
。因此,在该文件的底部,我必须添加:
export APACHE_ARGUMENTS="-D dev"
然后使用以下命令重新启动服务器:
/etc/init.d/apache2 stop
/etc/init.d/apache2 start
在其他系统上:
然而,有一篇关于这个主题的Debian文章,在这里讨论了这个问题here。 在那个例子中,要编辑的文件是/etc/default/apache2,变量被称为APACHE_DEFINES
。
同样,在某些系统上,它是一个名为OPTIONS
的变量,设置在/etc/sysconfig/httpd
中。
因此,你真正需要做的是查找apache2ctl文件中的起始部分。所以,首先通过执行whereis apache2ctl
命令来找到该脚本所在的位置,将其输出并查找带有apache2指令的启动部分,并查看传递的变量是OPTIONS
、APACHE_ARGUMENTS
、APACHE_DEFINES
或其他内容。然后,通过试验/etc/sysconfig/httpd
、/etc/default/apache2
或/etc/apache2/envvars
来确定需要编辑的文件。
我尝试了IfDefine
方法,但它没有起作用,即使我在Apache启动时传递的定义变量在APACHE_ARGUMENTS
行上在phpinfo()
中确实显示出来。
我尝试了另一种方法,它完美地工作了。在你的.htaccess
文件中,你需要像这样写:
# 判断域名是否为本地(我想检查两个名称)?
<If "%{SERVER_NAME} != 'localhost' && %{SERVER_NAME} != 'myproject.localhost'">
# 我只想保护生产服务器
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>