【问题标题】:Problem detecting empty REQUEST_URI with Apache mod_rewrite使用 Apache mod_rewrite 检测空 REQUEST_URI 的问题
【发布时间】: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]

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

更新

  1. 空 REQUEST_URI:http://1st-domain.com
  2. 非空 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>

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

【问题讨论】:

标签: apache url mod-rewrite url-rewriting


【解决方案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]
          

          没有空验证的引号

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2017-03-23
            • 1970-01-01
            • 2014-09-20
            • 2012-02-16
            • 2015-03-31
            • 1970-01-01
            相关资源
            最近更新 更多