我应该如何在.htaccess中使用<If>指令?


16

我试图在我的.htaccess文件中使用Apache的If指令添加条件语句。

我已经引用了该页面http://httpd.apache.org/docs/trunk/mod/core.html#if,但是它并没有详细说明/给出了很多示例。它给出了两个不完整的示例:

<如果%{REQUEST_METHOD}在GET,HEAD和OPTIONS中> 

<如果“ $ req {Host} =''”> 

因此,我尝试将其添加到我的.htaccess文件中:

<如果%{SERVER_PORT}在GET,HEAD,OPTIONS中>
   #这里什么都没有
</ If>

但是当我尝试加载页面时,我仍然收到错误500。这是在我的本地安装上,以前运行良好(或者如果我删除了该代码)。我相信我已经AllowOverride All在全球范围内进行了设置,并且If指令的上下文应该允许它出现在.htaccess中(“上下文:服务器配置,虚拟主机,目录,.htaccess”)。

有人可以给我一些如何正确使用<If>指令的示例,或者一些有关为什么它对我不起作用的指南吗?

谢谢!


1
如果出现500错误,则表示Apache已将某些内容记录到错误日志中。它说什么?另外,您对SERVER_PORTin 的测试GET,HEAD,OPTIONS没有任何意义(SERVER_PORT将是接收请求的端口号)。
larsks 2011年

谢谢,幼虫。看起来我正在运行不支持<If>指令的apache 2.0。也许我需要考虑升级到2.3。至少这解释了为什么在任何地方都没有示例(因为该功能太新了)。谢谢你的建议。
cwd

Answers:



16

<If> 仅在Apache 2.4+中可用,因此首先请确保您具有该版本。

例子

# Compare the host name to example.com and redirect to www.example.com if it matches
<If "%{HTTP_HOST} == 'example.com'">
  Redirect permanent "/" "http://www.example.com/"
</If>

<If "%{HTTP_HOST} =~ /regex/">
  SecFilterEngine Off
  SecFilterScanPOST Off
</If>

<If "%{REQUEST_URI} =~ m#/regex/including/slashes/#">
  SecFilterEngine Off
  SecFilterScanPOST Off
</If>

替代品 <If>

如果您仍然坚持使用Apache 2.2,则还有其他一些解决方案来执行条件语句。

  • 您可以通过以下方式设置环境变量:

    • Apache配置
    • SetEnvIf
    • mod_rewrite的 RewriteMatch
  • 然后,您可以使用以下命令执行条件语句

    <IfDefine MyEnvironmentVar>
       ...
    </IfDefine>
    

例:

# Set environment variable if we're on staging site
SetEnvIf Host staging ROBOTS_NOINDEX

# Set environment variable if we're within a specific folder
SetEnvIf Request_URI ^/app/webroot/files/ ROBOTS_NOINDEX

# Send custom header if environment variable is set
Header set X-Robots-Tag "noindex" ENV=ROBOTS_NOINDEX

1
测试但不起作用!Apache的文档中,<IfDefine>指令只解析在启动和parameter-name只可以通过命令promp使用传递httpd -Dx=y
梁永祥

您的“ If的替代方案”对我来说很好,很好的例子。
Kyborek '17
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.