这是您之前可能遇到的Apache问题。我希望有一个源代码包可以部署到我的工作站,我的登台服务器和我的生产服务器,但是它可以根据URL的内容加载不同的.htaccess设置。
请注意,我正在使用带有IfModule调用的kludge,但这对我们的新生产服务器不起作用,因为它与我的临时服务器共享所有相同的模块。
注意我需要将SetEnv与这些重写捆绑在一起。目前,如果你使用RewriteCond,它只会绑定到下面的RewriteRule,而不是下面的SetEnv。
答案 0 :(得分:15)
使用RewriteRule本身的环境变量设置功能,而不是使用SetEnv:
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>
答案 1 :(得分:6)
在Ubuntu Linux 上,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文件中查找start部分。所以,首先做一个whereis apache2ctl
来找到那个脚本的位置,把它拿出来找到包含apache2指令的start部分,看看它传递的变量是OPTIONS
,{{1 },APACHE_ARGUMENTS
或其他内容。然后,通过APACHE_DEFINES
,/etc/sysconfig/httpd
或/etc/default/apache2
的实验,查看您需要修改的文件。
答案 2 :(得分:1)
这是一个简单的示例,应该足以让您更改它以满足您的要求:
<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>
答案 3 :(得分:0)
我尝试了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。可能不适用于早期版本。