静态资源被错误地重写到前端控制器 index.php

Posted

技术标签:

【中文标题】静态资源被错误地重写到前端控制器 index.php【英文标题】:Static resources being incorrectly rewritten to front-controller index.php 【发布时间】:2012-04-23 15:20:20 【问题描述】:

我在重写 url 时遇到了问题。 正在发生以下情况:

http://www.example.com/scores
http://www.example.com/registreren
http://www.example.com/login

这些 url 将被重定向到 index.php?route=scores

这一切都很好。但现在我在imagesstylesheet 之类的子目录中有模板文件。这些文件在

template/css/style.css images/images.png

现在所有这些文件也被重定向到index.php?route。 我知道前导斜杠和文件的所有链接都是绝对路径。

.htaccess 文件中使用了以下代码:

RewriteEngine On

RewriteCond %REQUEST_FILENAME !-d
RewriteCond %REQUEST_FILENAME !-f
RewriteRule ^(.*)/?$ index.php?route=$1 [L,QSA]

【问题讨论】:

为了测试将上面的 RewriteRule 注释掉,然后尝试点击:your css 下方(及上方)cmets 中“您的 css”的链接 - 您说正在“重定向” - 缺少问题中所述的 /css 路径段? 【参考方案1】:

尝试使用此代码添加 RewriteBase:

RewriteBase /

根据服务器配置,%REQUEST_FILENAME 可能在开头包含一个斜杠,这将产生绝对路径而不是相对路径。

【讨论】:

我尝试添加 RewriteBase,也不起作用。样式表只是被重定向 link 尝试将 %REQUEST_FILENAMEecho 作为第二个参数传递值。 如果可能的话,您也可以尝试将 mod rewrite loglevel 设置得更高并发布您的日志文件。 只有当.htaccess 文件不在文档根目录中或RewriteBase 指令已被错误设置并需要“更正”时,此处才需要RewriteBase 指令。但是,情况似乎并非如此,因为 OP 已经表示,对这些所谓的“静态资源”的请求正在被重写为 index.php?route=(与其他 URL 一样)——而它根本不应该被重写。期望的行为是这些“静态资源”应该被前端控制器忽略【参考方案2】:
RewriteCond %REQUEST_FILENAME !-d
RewriteCond %REQUEST_FILENAME !-f

如果静态资源被 html 源代码中的根相对(或绝对)URL 正确引用(并且没有冲突的 BASE 元素),那么这些条件应该已经排除了静态资源被重写。

您可以向您的前端控制器添加一个条件,排除对特定文件扩展名的请求(假设您需要重写的 URL 也不共享这些文件扩展名)。

这也是对任何前端控制器的推荐优化,因为它可以防止对静态资源进行不必要的文件系统检查 - 如果未找到(而不是通过框架路由),它将简单地默认为 404。

例如:

RewriteEngine On

RewriteCond %REQUEST_URI !\.(css|js|png|jpg|png|gif)$ [NC]
RewriteCond %REQUEST_FILENAME !-d
RewriteCond %REQUEST_FILENAME !-f
RewriteRule ^(.*)/?$ index.php?route=$1 [L,QSA]

只有当请求的 URL 不以所述文件扩展名之一结尾时,它才会执行文件系统检查并可能将 URL 重写为 index.php(前端控制器)。

【讨论】:

以上是关于静态资源被错误地重写到前端控制器 index.php的主要内容,如果未能解决你的问题,请参考以下文章

前端静态资源缓存控制策略浅析

知识盲点汇总

知识盲点汇总

在 /* 上映射全局前端控制器 servlet 时如何访问静态资源

在 /* 上映射全局前端控制器 servlet 时如何访问静态资源

Spring MVC前端控制器不拦截静态资源配置