【问题标题】:Creating a mod_rewrite rule in an htaccess file在 htaccess 文件中创建 mod_rewrite 规则
【发布时间】:2011-07-01 13:51:28
【问题描述】:

我正在尝试创建一个mod_rewrite 规则来将人们引导到一个子文件夹。目前代码如下:

RewriteEngine On

RewriteCond %{HTTP_HOST} abcsite.com$ [OR,NC]
RewriteCond %{HTTP_HOST} ^!www\.abcsite\.*$ 
RewriteCond %{REQUEST_URI} !^/abc/.*$ 
RewriteRule (.*)$ /abc/$1 [L]

如果用户键入www.abcsite.com,重定向会起作用,但如果他们键入abc.com,则不会。是否有什么我遗漏或应该采取不同的措施来确保用户转到正确的文件夹(无论他们如何键入 URL)?

旁注:我正在处理的htaccess 文件是一个Joomla 文件,因此它的所有内容都处理另一个Joomla 站点。感谢您的帮助。

【问题讨论】:

  • @Donut - 我认为你不应该编辑规则。 OTOH,OP 可能意味着 abcsite.com,而不是 abc.com
  • @aaz 如果您查看编辑历史记录,您会发现我没有更改规则。我只是将它们放入一个代码块中,该代码块将每个规则按照 OP 的意图分隔到自己的行中。
  • @Donut – 奇怪:在修订屏幕中,它显示斜杠已添加到第二个正则表达式中。当然,原始版本的来源有它们。

标签: .htaccess mod-rewrite redirect subdirectory


【解决方案1】:

因为你有条件。

RewriteCond %{HTTP_HOST} abcsite.com$ [OR,NC]
RewriteCond %{HTTP_HOST} ^!www\.abcsite\.*$ 
RewriteCond %{REQUEST_URI} !^/abc/.*$ 

以上所有规则都只会通过它的 abcsite.com

您也添加以下规则,然后它也适用于 abc.com。

RewriteCond %{HTTP_HOST} abc.com$ [OR,NC]
RewriteCond %{HTTP_HOST} ^!www\.abc\.*$ 
RewriteCond %{REQUEST_URI} !^/abc/.*$ 
RewriteRule (.*)$ /abc/$1 [L]

【讨论】:

    【解决方案2】:

    在您的第二种情况下,有一个流浪的!。模式前面的! 表示当正则表达式 匹配时条件为真(如在第三个条件中)。模式中的! 只是一个文字符号。

    主机条件应该是这样的:

    RewriteCond %{HTTP_HOST} ^abcsite\.com$ [OR,NC]
    RewriteCond %{HTTP_HOST} ^www\.abcsite\.com$ [NC]
    

    事实上,它们可以连接成一个条件(注意,这里没有[OR]):

    RewriteCond %{HTTP_HOST} ^(www\.)?abcsite\.com$ [NC]
    

    您的第三个条件旨在防止重定向循环(/foo/abc/foo/abc/abc/foo → ...)。它的意思是,如果请求 URL 以 /abc/ 开头,则不应用该规则。但是,您的实际重定向是内部重定向:如果用户访问abcsite.com/foo,则服务器在内部将其重写为/webroot/abc/foo,但REQUEST_URI 保持不变,/foo

    这不会导致重定向循环的原因很可能是在abc/.htaccess 中重写规则,一旦重定向完成,就会覆盖这个规则。

    第三个条件应该检查​​的是重写规则匹配的路径:

    RewriteCond $1 !^abc/
    RewriteRule (.*) /abc/$1 [L]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-27
      • 1970-01-01
      • 1970-01-01
      • 2015-07-27
      • 1970-01-01
      • 2012-04-22
      • 1970-01-01
      相关资源
      最近更新 更多