我怎样才能拥有条件.htaccess块?

时间:2009-04-10 02:23:18

标签: apache .htaccess apache2

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

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

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

4 个答案:

答案 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。可能不适用于早期版本。