apache - 一个 URL 如何被 htaccess 中的多个重写规则修改?

标签 apache .htaccess mod-rewrite

我想问一个问题,以了解 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

现在的问题:
  • 为什么我在添加 之前得到了那个 URL大号 标记规则 R1?
  • 大号 flag 应指示应用匹配规则,然后停止使用其他规则。但是,使用 大号 标志集,两者 R1 R2 被应用。为什么?

  • 谢谢你的时间。

    问候,
    一种。

    最佳答案

    如果我们不清楚模块的行为方式,[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/

    相关文章:

    用于检查服务器上是否允许 .htaccess 的 php 脚本(函数)

    apache - 将旧搜索重定向到新搜索并保留第一个参数

    php - file_get_contents( ) 不工作

    objective-c - 使用 objective-c 的 Web 应用程序编程?

    django - 从 Django wsgi.py 文件访问 Apache SetEnv 变量

    apache - HTTP 管道请求文本示例

    内置服务器的 PHP Storm 无法识别 mod_rewrite

    php - 删除文件扩展名的正确方法

    regex - 倒置文件匹配?

    apache - RewriteCond %{SERVER_NAME} 语法