【问题标题】:.htaccess rewrite keeps going after a match is made.htaccess 重写在匹配后继续进行
【发布时间】:2012-09-09 04:04:42
【问题描述】:

我会先说明 htaccess 和 mod_rewrite 不是我最擅长的领域。我编写了一个供个人使用的 php MVC 框架,在文档根目录中,我有一个名为“public”的文件夹,用于存放 css、js、图像等。每个 HTTP 请求都会针对“public”中的文件进行检查,如果存在,它发送该文件;否则它会重定向到框架的 index.php。

规则有效,但如果在“public”中进行匹配,它仍会路由到 index.php。如果我注释掉重定向到 index.php 的最后一行,css 和 js 会正确加载。在“公开”匹配完成后,我无法让它停止处理。

提前致谢

Options +FollowSymLinks
RewriteEngine On

#If file exists as public resource
RewriteCond %{DOCUMENT_ROOT}/public/$1 -f
RewriteRule ^(.*) %{DOCUMENT_ROOT}/public/$1 [NC,L]


#Redirect everything else to index.php
RewriteRule ^(.*) index.php [NC,L]

【问题讨论】:

    标签: php .htaccess mod-rewrite


    【解决方案1】:

    需要加个测试看看请求是否已经指向公共目录,如果没有就触发RewriteRule:

    RewriteCond %{REQUEST_URI} !^/public/
    RewriteRule ^.*$ index.php
    

    请注意,[L](“最后一个”)标志经常被误解。它会阻止请求在当前通道中被进一步测试和修改,但它不能阻止 Apache 从一开始就通过整个规则集运行新修改的请求(这会发生,因为应用了 .htaccess 规则,从顶部到每个新的或修改的请求)。所以你需要添加 RewriteCond 指令来检查你没有处理在规则集的前一次传递中指向公共文件夹的请求。

    有关详细信息,请参阅Apache 2.4 documentation for the "last" flag。 [请注意,Apache 2.4 提供了[END] 标志,该标志将阻止请求接受另一次重写处理,但这个新标志在 Apache 2.2 及更早版本中不可用。]

    【讨论】:

    • 是的,我确实理解 [L] 标签,我只是变得绝望,想也许我可以得到一些工作哈哈。而且 [END] 标签在我的 MAMP 上不起作用 :( 但你所说的没有被指出是有道理的,我会看看它是否有效 :)
    • 谢谢你。简单有效。
    • 如果您想阻止直接访问 /public 中的文件(即只允许在重写后访问),请参阅this question 的答案。
    【解决方案2】:

    您似乎在进行一些不必要的检查,并且每次执行重写时都会触发新的规则通过。

    也许可以试试这样?

    RewriteEngine On
    
    # pass through anything in the domain.com/public directory
    RewriteRule ^/public/(.*)$ - [NC,L]
    
    # route everything else to index
    RewriteRule ^(.*)$ index.php [NC,L]
    

    这应该在第一次通过公共目录中的任何内容,其他所有内容将需要 2 次通过才能解决第二条规则,AFAIK。我认为主要的技巧是提供一个不会触发重写的路由,所以你不会触发第二遍。

    请记住,除非您打算使用它们的内容重写为 $1,$2,...,否则括号并不是真正需要的。

    【讨论】:

    • 哦,我从来不知道括号的事情:)很高兴知道!
    • 我已经有一段时间没有使用我的规则了,您可能需要在最后一个规则之前添加另一个,例如RewriteRule ^index\.php$ - [NC,L],以防止在最后一个规则上连续循环。我认为它会向 apache 日志抛出一个错误,比如重写太多。我会检查一下:)
    • 适当注明(额外文字,因为我无法提交简短的评论。哈哈)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-09
    • 1970-01-01
    • 2015-09-24
    • 1970-01-01
    • 2023-04-03
    相关资源
    最近更新 更多