网址重写破坏了指向 css 的链接
Posted
技术标签:
【中文标题】网址重写破坏了指向 css 的链接【英文标题】:Url rewriting broke link to css 【发布时间】:2011-07-24 16:33:03 【问题描述】:我正在使用以下设置进行 url 重写:
RewriteEngine On
RewriteCond %REQUEST_FILENAME !-d
RewriteCond %REQUEST_FILENAME !-f
RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
在index.php
中解析$_GET['url']
以便在以下示例中:
ROOT/user/id/1/name/bobby // user is the page, id = 1, name = bobby
ROOT/blog/post/123/title/welcome // blog is the page, post = 123, title = welcome
所以第一个参数(?我不知道如何调用它)是页面名称,那么以下几个参数就像“键/值”。
现在,当我浏览 ROOT/
时,指向插入到页面 html 中的样式表的链接并且页面正确显示。
我浏览ROOT/index
(与ROOT/
相同)它正确显示页面(包含内容和其他内容),但未加载样式表的链接(即使在html 结构中正确写入)。而且我可以从我的页面在加载时根本没有 css 的事实中看出这一点。
我该如何解决这个问题?
编辑
css文件的路径如下:
project/view/css/common.css
它包含在哪个文件中
project/public/index.php // the one with .htaccess and rewrite rules
这让我创建了一个链接(在 index.php 中),例如
../view/css/common.css
但这取决于 url 的显示方式。例如:
# For URL = public/
project/view/css/common.css // good
# For URL = public/index/
project/public/view/css/common.css // broken
# For URL = public/index/key/value
project/public/index/key/view/css/common.css // broken
【问题讨论】:
html 中的 css 链接是什么样的?他们有没有前面的斜线? @davogotland,我的链接看起来像真正的路径链接。 @davogotland,它们看起来像这样localhost/project/public/view/css/index.css 【参考方案1】:评论不允许我格式化代码,你可以试试这个:
RewriteEngine On
RewriteCond %REQUEST_FILENAME !-d
RewriteCond %REQUEST_FILENAME !-f
RewriteCond %REQUEST_URI !^.*\.(css|jpe?g|gif|png|js|ico)$ [NC]
RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
更新
您可以在页面的 <head>
部分尝试这样的操作,以支持该页面上引用的 image/css/js 文件的相对路径:
<head>
<base href="http://www.example.com/static-files/" />
</head>
【讨论】:
@Charlie Pigarelli:请尝试添加基本标签以支持页面上静态文件的相对 URL:例如<head> <base href="http://www.example.com/static-files/" /> </head>
+1 这是我一直在寻找的行,以阻止我对外部内容的请求被重写!【参考方案2】:
我认为你有两个问题(因为给出的答案还没有解决你的问题......):
您正在重写所有文件名,因此当浏览器请求 css/index.css
时,您的重写会将其转换为 index.php?url=css/index.css
。 @cOle2 的回答应该可以解决这个问题。
您的 css 文件没有使用绝对路径。服务器正在将请求的页面(如/user/id/1/name/bobby
)转换为/index.php?etc....
,但是当浏览器请求例如您的代码中类似于css/index.css
的css 文件时,它实际上会请求/user/id/1/name/bobby/css/index.css
并且该文件不存在。您可以通过仅使用外部文件(css、js、图像等)的绝对路径来解决这个问题,例如 /css/index.css
。
编辑:根据您的 cmets,您的路径都是相对的,浏览器无法访问您的 css,因此您需要:
-
将 css 移至
project/public
目录(如 project/public/css
)
使用您的 CSS 的绝对路径,例如 /css/index.css
。
确保您的外部文件的 url 没有被服务器重写。
【讨论】:
我认为这是一个好方法。问题是我正在使用诸如“../view/css/common.css”之类的相对路径来访问返回到公共文件夹的文件夹中的文件。我怎么能把它变成绝对路径? @Charlie Pigarelli 与您的目录结构相比,您的网络服务器的根是什么?如果是project/public/
,那么您的 css 文件不可公开访问,因此您需要将它们移动到 project/public/
目录。
用户浏览的目录是project/public/
,因此他无法访问所有其他文件夹,例如project/class/
或project/library/
或project/view
。当 css 文件位于 project/view/css/common.css
.
@Charlie Pigarelli 那么问题来了,用户无权访问project/view
目录中的css文件。【参考方案3】:
您可以尝试从重写规则中删除某些文件扩展名,例如以下规则将忽略图像、css 和 js 文件。
# Do not process images or CSS files further
RewriteRule \.(css|jpe?g|gif|png|js|ico)$ - [L]
编辑:这就是我将如何应用它:
RewriteEngine On
RewriteRule \.(css|jpe?g|gif|png|js|ico)$ - [L]
RewriteCond %REQUEST_FILENAME !-d
RewriteCond %REQUEST_FILENAME !-f
RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
【讨论】:
放在RewriteEngine之后就行了 @cOle2,不工作。我也更新了我的问题。请看一看。 看看@jeroen 的回答,听起来你的路径是相对的。 简单的解决方案是在 css 文件路径的开头放置一个斜杠:/project/view/css/common.css @anubhava update 也应该可以。以上是关于网址重写破坏了指向 css 的链接的主要内容,如果未能解决你的问题,请参考以下文章
使用 php 和 .htaccess 进行友好的 url 重写。与 css 图像和 js 的相对链接的困难
构建反应应用程序的版本,提供指向 CSS 和 JS 文件的错误链接