【问题标题】:Apache URL Rewriting,Apache URL 重写,
【发布时间】:2010-10-30 18:32:39
【问题描述】:

我正在尝试在我的网站上进行 URL 重写。这是我的 .htaccess 的内容:

RewriteEngine On
RewriteRule ^blog/?$ index.php?page=blog [L]
RewriteRule ^about/?$ index.php?page=about [L]
RewriteRule ^portfolio/?$ index.php?page=portfolio [L]
#RewriteRule ^.*$ index.php?page=blog [L]

现在 3 条未注释的重写规则完美运行,如果我尝试 http://www.mysite.com/blog/,我会被重定向到 http://www.mysite.com/index.php?page=blog,“about”和“portfolio”也是如此。但是,如果我输入错误的博客,比如我尝试http://www.mysite.com/bloh/,那么显然我会收到 404 错误。评论中的最后一条规则是为了帮助防止这种情况发生。任何 URL 都应该被重定向到博客,当然,即使我们成功使用了之前的规则,这条规则仍然会被解析,所以我使用了“last”标志([L])。如果我取消注释我的最后一条规则,任何内容,包括博客、关于和投资组合,都会重定向到博客。 “last”标志不应该在找到匹配规则后立即停止执行吗?

谢谢。

【问题讨论】:

    标签: apache .htaccess url-rewriting


    【解决方案1】:

    是的,Last 标志意味着它不会在此请求中应用遵循此规则的任何规则

    在重写 URL 后,它会使用新的重写 URL 发出一个内部请求,该 URL 将与您的最后一个 RewriteRule 匹配,因此您的重定向进入无限循环。

    使用RewriteCond 指令将重写限制为不以index.php 开头的URL,你应该没问题。

    【讨论】:

      【解决方案2】:

      您可以添加如下条件:

      RewriteCond %{REQUEST_URI} !^index\.php
      

      我还要提到,使用RewriteRule ^.*$ 也是破坏所有媒体请求(css、js、图像)的好方法。您可能需要添加一些条件,例如:

      RewriteCond %{REQUEST_FILENAME} !-d
      RewriteCond %{REQUEST_FILENAME} !-f
      

      确保您不会尝试重写服务器上存在的实际文件或目录。否则它们将无法访问,除非 index.php 也提供这些服务!

      【讨论】:

        【解决方案3】:

        来自 apache 的mod_rewrite docs

        'last|L'(最后一条规则) 在这里停止重写过程,不再应用任何重写 规则。这对应于 Perl 最后一个命令或中断命令 C. 使用此标志来防止 当前重写的 URL 从 通过以下规则进一步重写。 但是请记住,如果 RewriteRule 生成一个内部 重定向(经常发生在 在每个目录上下文中重写), 这将重新注入请求并 将导致重复处理 从第一个 RewriteRule 开始。

        你可以使用

         ErrorDocument 404 /index.php?page=blog
        

        但你应该知道它不返回 404 错误代码,而是一个重定向代码,我不知道这是否是一个很好的做法。

        【讨论】:

        • 感谢您的回答。如果你仔细看的话,我当前的正则表达式已经考虑了可选的斜杠。
        • 哦,是的。我没看到。对不起:)
        【解决方案4】:

        在您 [L] 取消对请求的处理后,整个处理过程会再次针对新的(重写的)URL 运行。您可以通过在其他规则之前使用来摆脱该循环:

        RewriteRule ^index.php - [L]
        

        意思是“对于index.php,不要重写,离开处理。”

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-03-17
          • 2017-05-17
          • 2018-02-20
          • 2014-05-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多