【问题标题】:Stop mod_rewrite returning REQUEST_URI when (.*) is empty当 (.*) 为空时停止 mod_rewrite 返回 REQUEST_URI
【发布时间】:2011-08-18 17:35:38
【问题描述】:
Options +FollowSymLinks
RewriteEngine On
RewriteRule ^mocks/site/(.*)$ http://thelivewebsite.com/$1 [R=301,L]

这是我的 htaccess 文件的内容。

htaccess 文件位于主机帐户的根目录中,我只想将目录mocks/site/ 重定向到新域(有或没有任何额外目录)。

例如:如果有人去http://mywebsite.com/mocks/site,那么它需要重定向到http://thelivewebsite.com。如果他们去http://mywebsite.com/mocks/site/another/directory,那么它需要重定向到http://thelivewebsite.com/another/directory。我希望这是有道理的。

所以我遇到的问题是,当mocks/site/ 之后有某些东西时,上面的 htaccess 代码似乎工作得很好,但是当之后没有什么东西时,重定向中的 $1 似乎引用了整个 REQUEST_URI (例如:mocks/site/ 而不是什么都没有 - 因为它之后什么都没有)。

我不知道如何阻止这种情况。我考虑过使用 RewriteCond,但我不确定在那里使用什么。我找不到任何可以帮助我确定mocks/site/ 之后是否有任何内容的内容。

任何帮助将不胜感激。

谢谢。

【问题讨论】:

    标签: .htaccess mod-rewrite


    【解决方案1】:

    这是非常奇怪的行为——从未见过这样的事情。因此,我认为它可能是别的东西(另一个地方的规则 - 在旧网站甚至新网站上)。我建议启用重写调试 (RewriteLogLevel 9) 并检查重写日志(如果可以编辑 Apache 的配置文件/虚拟主机定义)。

    无论如何,试试这个组合

    Options +FollowSymLinks
    RewriteEngine On
    
    RewriteRule ^mocks/site/$ http://thelivewebsite.com/ [R=301,L]
    RewriteRule ^mocks/site/(.+)$ http://thelivewebsite.com/$1 [R=301,L]
    

    它将分两步进行匹配/重定向:第一条规则用于精确的目录匹配(因此根本不涉及$1),如果/mocks/site/ 之后至少有一个字符,则第二条将起作用。

    或者(Apache 文档甚至推荐这个)使用 Redirect 指令(根本不需要 mod_rewrite for such simple redirects):

    Redirect 301 /mocks/site/ http://thelivewebsite.com/
    

    【讨论】:

    • 太棒了,谢谢,您的第一个建议很有帮助。 :) 如果之后什么都没有,它首先重定向的地方。重定向指令似乎没有做任何事情,所以我可能做错了,但是第一个可以正常工作。
    猜你喜欢
    • 2011-09-29
    • 1970-01-01
    • 2015-04-28
    • 2012-01-20
    • 2021-09-11
    • 1970-01-01
    • 1970-01-01
    • 2011-08-06
    • 2019-04-25
    相关资源
    最近更新 更多