【问题标题】:Rewrite Problem - L(ast) not being respected?重写问题 - L(ast) 不被尊重?
【发布时间】:2011-03-29 18:25:48
【问题描述】:

所以我正在为一个网站开发一个 CSS/JS 压缩系统,它基本上具有以下 htaccess

RewriteEngine On

...

RewriteRule ^css/images/(.*)$ images/site/$1?%{QUERY_STRING} [L]
RewriteRule ^css/([0-9a-fA-F]{32})$ assets.php?hash=$1 [L]

RewriteCond %{HTTP_HOST} ^www.site.com [NC]
RewriteRule ^(.*)$ http://site.com/$1 [L,R=301]

RewriteRule ^([a-zA-Z0-9_.-]+)$ index.php?url=$1&%{QUERY_STRING} [L]

php_flag register_globals off
php_flag magic_quotes_gpc off
php_flag register_long_arrays off

# 404 Handler
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?url=$1&%{QUERY_STRING}

现在 assets.php 没有收到 hash 调用,而是 index.php - 如果我删除 RewriteRule ^([a-zA-Z0-9_.-]+)$ index.php?url=$1&%{QUERY_STRING} [L]

它工作正常,但我不知道为什么 - 资产上的 [L] 标志不应该重写 RewriteRule ^css/([0-9a-fA-F]{32})$ assets.php?hash=$1 [L] 阻止执行任何进一步的重写吗?我对这里发生的事情感到困惑。

如果您对此有所了解,我们将不胜感激。

【问题讨论】:

    标签: apache .htaccess mod-rewrite


    【解决方案1】:

    L 标志表示“不再执行规则集中的任何规则”,这很奇怪并不意味着 mod_rewrite 将不再执行任何规则。

    当您在每个目录上下文中指定 mod_rewrite 指令时,例如使用 .htaccess 或服务器或虚拟服务器配置的 Directory 部分,重写在 Apache 处理阶段的后期进行。为了在这里发挥它的魔力,mod_rewrite 必须在每次重写您的 URL 时执行内部重定向。

    由于您的重写可能会将您指向不同的目录,mod_rewrite 将自己指定为此重定向的处理程序,以便它可以通过在您将请求发送到的新位置可能找到的任何规则。通常,由于您只处理根目录中的单个 .htaccess 文件,因此“新”位置中的规则恰好是首先导致重写的规则。

    因此,在您的情况下,会发生以下情况:

    • 请求/css/A01EF
    • mod_rewrite 启动规则集
    • ^css/([0-9a-fA-F]{32})$ -> assets.php?hash=A01EF
    • L 标志停止重写并强制内部重定向到 assets.php?hash=A01EF
    • mod_rewrite 重新启动规则集
    • ^([a-zA-Z0-9_.-]+)$ -> index.php?url=assets.php&hash=A01EF(顺便说一下,你可以在这里使用QSA
    • L 标志停止重写并强制内部重定向到 index.php?url=assets.php&hash=A01EF

    这个循环很可能会继续,但mod_rewrite 识别出您正在重定向到同一页面,并在此之后忽略您的重写。

    这整个过程恰好就是为什么这两个条件...

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

    ...在.htaccess mod_rewrite 规则集中非常常见,因为它们提供了一种简单的方法来确定URL 是否已经被重写为预期的真实资源。您可以使用它们,也可以在请求已重写为 assets.php 时排除 index.php 重写:

    RewriteCond %{REQUEST_URI} !^/assets.php
    RewriteRule ^([a-zA-Z0-9_.-]+)$ index.php?url=$1&%{QUERY_STRING} [L]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-18
      • 1970-01-01
      • 1970-01-01
      • 2013-09-01
      • 2015-09-09
      • 2020-03-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多