我想问一个问题,以了解 Apache 如何处理 .htaccess 文件中指定的重写规则。
在我的网站上,我使用了分类页面的经典组织,每个类别都有多个部分:
http://www.mysite.com/category/section.html.
但是,没有html页面,一切都由pages.php中的代码处理。使用一个简单的重写规则,像上面这样的 URL 被映射到:
http://www.mysite.com/pages.php?cat=category&page=section
我决定从 重命名一个部分第 1 节 至第 1 节-xxx .为了满足对旧名称(section1)的请求,我添加了一个简单的规则来映射 section1.html 在 section1-xxx.html .
我在 .htaccess 中添加的第一条规则如下:
R1
RewriteRule ^CAT1/section1.html$ CAT1/section1-xxx.html [NC]
在哪里 第一类 是一个类别的名称。
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:
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] 标志可能会产生意想不到的结果。请注意,以下内容仅适用于在 .htaccess 文件中使用 mod_rewrite 时。 [L] 标志在 httpd.conf 中使用时的行为与预期完全一样。
L 标志将告诉 Apache 停止处理该请求的重写规则。现在通常没有意识到的是,它现在对新的、重写的文件名发出新请求,并再次开始处理重写规则。
因此,如果您要在目标仍然与模式匹配的情况下进行重写,它将不会按预期运行。在这些情况下,您应该使用 RewriteCond 从规则中排除某个文件。
正如您所解释的,将 L 添加到 R1。(R1 将 something.html 重定向到 someone.html 即您需要他们的 html 页面!)
关于apache - 一个 URL 如何被 htaccess 中的多个重写规则修改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6160387/