我正在尝试在我的 .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 中> #这里还没有任何内容 </如果>
但我不断错误 500当我尝试加载页面时。这是我的本地安装,之前运行良好(或者如果我删除该代码)。我相信我已经进行了AllowOverride All
全局设置,并且 If 指令的上下文应该让它出现在 .htaccess 中(“上下文:服务器配置、虚拟主机、目录、.htaccess”)。
有人可以给我提供一些如何正确使用 <If> 指令的例子,或者说明为什么它对我来说不起作用吗?
谢谢!
答案1
该<If>
指令仅适用于 Apache 2.4+,不适用于 2.2 或更早版本。
http://httpd.apache.org/docs/2.4/mod/core.html#if
2.2 版中不存在的文档:
答案2
<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