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

cwd*_*cwd 23 configuration .htaccess xampp apache-2.2

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

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

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

<If "$req{Host} = ''"> 

所以我尝试将其添加到我的 .htaccess 文件中:

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

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

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

谢谢!

tgr*_*ser 21

<If>指令仅在 Apache 2.4+ 中可用,在 2.2 或更早版本中不可用。

http://httpd.apache.org/docs/2.4/mod/core.html#if

2.2 中不存在的文档:

http://httpd.apache.org/docs/2.2/mod/core.html#if


Sim*_*ast 19

<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>
Run Code Online (Sandbox Code Playgroud)

替代品 <If>

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

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

    • 阿帕奇配置
    • SetEnvIf
    • mod_rewrite 的 RewriteMatch
  • 然后你可以使用执行条件语句

    <IfDefine MyEnvironmentVar>
       ...
    </IfDefine>
    
    Run Code Online (Sandbox Code Playgroud)

例子:

# 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
Run Code Online (Sandbox Code Playgroud)

  • 测试但不工作!在 apache 的文档中,`&lt;IfDefine&gt;` 指令只在启动时解析,`parameter-name` 只能通过命令提示使用 `httpd -Dx=y` 传递 (2认同)