如何通过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重命名为section1-xxx。为了满足对旧名称(section1)的请求,我在section1-xxx.html上将简单的规则映射到section1.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
网址首先转换为
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
现在的问题: 为什么在将L标志添加到规则R1之前获得该URL? L标志应指示应用匹配规则,然后停止使用其他规则。但是,设置L标志后,将同时应用R1和R2。为什么? 谢谢你的时间。 问候,  一种。     
已邀请:
        如果我们不清楚模块的行为,[L]标志可能会产生意外结果。请注意,以下内容仅在.htaccess文件中使用mod_rewrite时适用。在httpd.conf中使用时,[L]标志的行为与预期的完全相同。 L标志将告诉Apache停止处理该请求的重写规则。现在通常没有意识到的是,它现在对新的重写文件名发出新请求,并再次开始处理重写规则。 因此,如果您要在目标仍然与模式匹配的地方进行重写,则它将无法按预期运行。在这些情况下,应使用RewriteCond从规则中排除某个文件。 正如您所解释的,将L添加到R1中。     
        1)您需要R1中替换字符串中的开始/ 2)正如amolv所说,您通过重写引擎进行了两次迭代,在第一种情况下,R1和R2都匹配,并且在第二次迭代中,重写的url没有规则匹配;将L添加到R1,传入的URL在第一次迭代中仅匹配R1,在第二次迭代中仅匹配R2。使用R1和R2中的/开头,您不再需要R1中的L。 我想知道“ XXX”部分的内容;)     

要回复问题请先登录注册