在htaccess中,一个URL是如何被多个重写规则修改的



我想问一个问题,以了解Apache进程如何重写.htaccess文件中指定的规则。

在我的网站上,我使用了分类页面的经典组织,每个分类都有多个部分:

http://www.mysite.com/category/section.html.

然而,没有html页面,所有内容都由pages.php中的代码处理。使用一个简单的重写规则,像上面这样的URL被映射到:

http://www.mysite.com/pages.php?cat=category&page=section

我决定将一个部分从section1重命名为section1xxx。为了满足对旧名称(section1)的请求,我添加了一个简单的规则,将section1.html映射到section1.xxx.html.

我在.htaccess中添加的第一条规则如下:

R1

RewriteRule ^CAT1/section1.html$ CAT1/section1-xxx.html [NC]

其中CAT1是类别的名称。

R2

RewriteRule ^CAT1/(.*).html$ pages.php?cat=CAT1&page=$1 [L,NC]

我的想法是先应用R1,然后应用R2。然而,当这些规则被应用时,我最终会得到一个无法解释的(对我的大脑来说)URL。

当请求以下页面时

http://www.mysite.com/CAT1/section1.html

URL首先在中转换

http://www.mysite.com/CAT1/section1-xxx.html/section1.html

然后在中

http://www.mysite.com/pages.php?cat=CAT1&page=section1-xxx.html/section1

出于好奇,我在规则R1:中添加了L(标志)

RewriteRule ^CAT1/section1.html$ CAT1/section1-xxx.html [L,NC]

一切都很顺利。现在http://www.mysite.com/CAT1/section1.html通过:提供服务

http://www.mysite.com/pages.php?cat=CAT1&page=section1-xxx

现在的问题是:

  1. 为什么我在将L标志添加到规则R1之前得到了该URL
  2. L标志应指示应用匹配规则,然后停止使用其他规则。但是,如果设置了L标志,则同时应用R1R2。为什么

谢谢你抽出时间。

谨致问候,A.

如果我们不清楚模块的行为,[L]标志可能会产生意外的结果。请注意,以下内容仅适用于在.htaccess文件中使用mod_rewrite的情况。[L]标志在httpd.conf.中使用时的行为与预期完全一样

L标志将告诉Apache停止处理该请求的重写规则。现在,通常无法实现的是,它现在对新的、重写的文件名发出新的请求,并再次开始处理重写规则。

因此,如果您要在目标仍然与模式匹配的情况下进行重写,那么它将不会按预期运行。在这些情况下,您应该使用RewriteCond从规则中排除某个文件。

正如您所解释的,将L添加到R1。(R1将something.html重定向到someone.html,即您将html页面重定向到他们的页面!)

1)您需要在R1 中的替换字符串中启动/

2) 正如amolv所说,重写引擎有两次迭代,在第一次迭代中,R1和R2都匹配,而在第二次迭代中重写的url不匹配任何规则;将L添加到R1,传入url在第一次迭代中仅匹配R1,在第二次迭代中只匹配R2。有了R1和R2中的起始/,你就不需要R1中的L了。

我想知道"XXX"部分的内容;)

最新更新