18

这是您以前可能遇到过的 Apache 问题。我想要一个可以部署到我的工作站、登台服务器和生产服务器的源包,但它可以根据 URL 加载不同的 .htaccess 设置。

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

注意我需要将 SetEnv 与这些重写捆绑在一起。目前,如果您使用 RewriteCond,它仅与以下 RewriteRule 相关联,而不与下面的 SetEnv 相关联。

4

4 回答 4

15

不使用 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>
于 2009-04-21T18:07:25.803 回答
6

在 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 指令的起始部分,并查看它传递的变量是OPTIONSAPACHE_ARGUMENTSAPACHE_DEFINES还是其他内容。然后,通过使用/etc/sysconfig/httpd/etc/default/apache2/etc/apache2/envvars.

于 2009-11-22T20:08:24.330 回答
2

我尝试了该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。可能不适用于早期版本。

于 2018-10-10T12:30:15.573 回答
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>
于 2009-04-10T02:39:20.093 回答