静态资源被错误地重写到前端控制器 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
等
这一切都很好。但现在我在images
和stylesheet
之类的子目录中有模板文件。这些文件在
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_FILENAME
和 echo
作为第二个参数传递值。
如果可能的话,您也可以尝试将 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 时如何访问静态资源