使用Apache mod_rewrite检测空REQUEST_URI时出现问题

时间:2011-04-16 06:33:54

标签: apache url mod-rewrite url-rewriting

我正在使用这样的重定向规则运行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]

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

更新

  1. 清空REQUEST_URI:http:/1st-domain.com
  2. 非空REQUEST_URI:http://1st-domain.com/something
  3. 第一条规则应该将空的request_uri指向3rd-domain.com,第二条规则应该将非空的request_uri指向2nd-domain.com

    有用的TIDBIT 您可以使用以下代码段打开mod_rewrite调试:

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

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

8 个答案:

答案 0 :(得分:9)

这应该有效:

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中,第一个重写规则应该是^\/$,而不仅仅是^$

答案 1 :(得分:9)

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

RewriteEngine on

RewriteCond %{REQUEST_URI} "^/$"

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

答案 2 :(得分:2)

这应该有效:

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

答案 3 :(得分:0)

您的规则会将请求重定向为空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>,因为我们之前已经处理过了)

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

如果请求为空,则apache'重定向'到index.html,因此-RewriteCond%{REQUEST_URI}索引可能对您有帮助。

答案 6 :(得分:0)

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

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

答案 7 :(得分:0)

这对我有用:

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]

清空空验证

上的引号