使用 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 路径 - server 和 directory 之间不同的正是这个 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]
第一条规则将首先匹配<empty>
,然后测试<non-empty or empty>
(现在不能是<empty>
,因为我们之前已经处理过了)
【讨论】:
【参考方案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 的问题的主要内容,如果未能解决你的问题,请参考以下文章
Apache2 - 使用 mod_rewrite 代理到另一个域
如果 .htaccess 使用 mod_rewrite,则 Apache httpd.conf mod_rewrite 取消