使用 Apache mod_rewrite 检测空 REQUEST_URI 的问题

Posted

技术标签:

【中文标题】使用 Apache mod_rewrite 检测空 REQUEST_URI 的问题【英文标题】:Problem detecting empty REQUEST_URI with Apache mod_rewrite 【发布时间】:2011-08-06 19:06:42 【问题描述】:

我正在运行带有如下重定向规则的 Apache:

RewriteCond %HTTP_HOST ^1st-domain\.com
RewriteRule ^(.*)$ http://2nd-domain.com$1 [R=permanent,L]

这成功地将http://1st-domain.com 重定向到http://2nd-domain.com 但是,当 REQUEST_URI 为空时,我想重定向到第三个域。

RewriteCond %HTTP_HOST ^1st-domain\.com$
RewriteCond %QUERY_STRING ^$
RewriteRule ^(.*)$ http://3rd-domain.com$1 [R=permanent,L]

但这不起作用,而是重定向到 2nd-domain.com

我的规则是这样排列的:

RewriteCond %HTTP_HOST ^1st-domain\.com$
RewriteCond %QUERY_STRING ^$
RewriteRule ^(.*)$ http://3rd-domain.com$1 [R=permanent,L]

RewriteCond %HTTP_HOST ^1st-domain\.com
RewriteRule ^(.*)$ http://2nd-domain.com$1 [R=permanent,L]

有什么建议吗?提前谢谢你。

更新

    空 REQUEST_URI:http://1st-domain.com 非空 REQUEST_URI:http://1st-domain.com/something

第一条规则应将空的 request_uri 指向 3rd-domain.com,第二条规则应将非空的 request_uri 指向 2nd-domain.com

有用的花絮 你可以用这个 sn-p 打开 mod_rewrite 调试:

<IfModule mod_rewrite.c>
RewriteLog "/home/domain.com/logs/rewrite.log"
RewriteLogLevel 3
</IfModule>

我不知道的非常有用的调试选项。

【问题讨论】:

***.com/questions/5684931 REQUEST_URI 永远不会为空。 【参考方案1】:

这应该可行:

RewriteCond %HTTP_HOST ^1st-domain\.com
RewriteRule ^$ http://3rd-domain.com [R=permanent,L]

RewriteCond %HTTP_HOST ^1st-domain\.com
RewriteRule ^(.+)$ http://2nd-domain.com/$1 [R=permanent,L]

希望对你有帮助!

注意:httpd.conf 和 .htaccess 之间的 REQUEST_URI 略有不同,它以 httpd.conf 中的额外反斜杠开头。这意味着在 httpd.conf 中,第一个重写规则应该是 ^\/$,而不仅仅是 ^$

【讨论】:

感谢您的尝试,但第二条规则将两个请求都提取为空的和非空的 request_uri。有什么想法吗? 好的,我解决了,但你的答案非常接近。 A: Apache 永远不会返回一个空的 request_uri,一个空的请求以 '/' 的形式出现,所以我只是将第一个重写规则更改为 ^\/$ 并且它可以工作! @crunchyt:您的重写规则在 httpd.conf 中,对吗?我在.htaccess 中测试了我的。 httpd.conf 和 .htaccess 之间的 REQUEST_URI 略有不同,它以 httpd.conf 中的额外反斜杠开头。很高兴你弄明白了! :) 没错,我也必须使用^\/$,因为我已将规则放在httpd.conf 中。它就像一个魅力,非常感谢大家! REQUEST_URI 服务器变量 always 有一个斜杠前缀,无论它在哪里使用。但这里使用的不是REQUEST_URI 服务器变量;它是与RewriteRule pattern 匹配的 URL 路径 - serverdirectory 之间不同的正是这个 URL 路径(即..htaccess) 上下文。【参考方案2】:

您的规则使用空 QUERY_STRING 重定向请求。

对于空的request_uri,可以使用

RewriteCond %HTTP_HOST ^1st-domain\.com$
RewriteRule ^$ http://3rd-domain.com$1 [R=permanent,L]

RewriteCond %HTTP_HOST ^1st-domain\.com
RewriteRule ^(.*)$ http://2nd-domain.com$1 [R=permanent,L]

第一条规则将首先匹配&lt;empty&gt;,然后测试&lt;non-empty or empty&gt;(现在不能是&lt;empty&gt;,因为我们之前已经处理过了)

【讨论】:

【参考方案3】:

我正在使用以下内容来捕获空的 REQUEST_URL:

RewriteEngine on

RewriteCond %REQUEST_URI "^/$"

RewriteRule ^(.*) http://%HTTP_HOST/my/another/url

【讨论】:

如何判断是否为空? @harrrrrrry 你可以在正则表达式前面加上!否定它。例如。 !^/$【参考方案4】:

在多站点上,这种重定向适用于我的空请求:

RewriteCond %HTTP_HOST ^1st-domain\.com$
RewriteCond %REQUEST_URI "^/$"
RewriteRule ^$ http://3rd-domain.com/ [R=permanent,L]

【讨论】:

【参考方案5】:

如果请求为空,则 apache 会“重定向”到 index.html,因此 -RewriteCond %REQUEST_URI index- 可能会对您有所帮助。

【讨论】:

【参考方案6】:

这应该可行:

RewriteCond %HTTP_HOST ^1st-domain\.com
RewriteRule ^(.*)$ http://2nd-domain.com$1 [R=permanent,L]
RedirectMatch ^/$ http://3rd-domain.com 

【讨论】:

【参考方案7】:

我尝试了此页面上所述的选项,我只想检查 REQUEST_URI 是否为空(或者在这种特殊情况下,/):

# Check of the request uri is just 1 char long (checking for a slash was harder):
RewriteCond %REQUEST_URI ^.$

【讨论】:

“检查斜线更难”? ^/$ 除了这是一个较旧的答案之外,我相信这不是一个选择是有原因的。虽然想不出来【参考方案8】:

这对我有用:

RewriteCond %HTTP_HOST ^(www\.)?1st-domain\.com$
RewriteCond %REQUEST_URI ^/$
RewriteRule .* http://3rd-domain.com/ [L,R=permanent]

RewriteCond %HTTP_HOST ^.*$
RewriteRule .* http://2nd-domain.com%REQUEST_URI [L,R=permanent]

没有空验证的引号

【讨论】:

以上是关于使用 Apache mod_rewrite 检测空 REQUEST_URI 的问题的主要内容,如果未能解决你的问题,请参考以下文章

关于伪静态的实现方法

在Apache中使用mod_rewrite模块重写URL

Apache2 - 使用 mod_rewrite 代理到另一个域

如果 .htaccess 使用 mod_rewrite,则 Apache httpd.conf mod_rewrite 取消

Apache - 添加虚拟目录后无法再使用 mod_rewrite

Apache mod_rewrite 和多个域