网址重写破坏了指向 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:例如 &lt;head&gt; &lt;base href="http://www.example.com/static-files/" /&gt; &lt;/head&gt; +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 的相对链接的困难

在编译时重写或破坏 C 单元测试的函数链接

构建反应应用程序的版本,提供指向 CSS 和 JS 文件的错误链接

Java 注释中怎么加入超链接 指向某网址

Django Admin 通过 apache 破坏了 CSS 链接,但在 runserver 模式下工作

Googleusercontent 在时事通讯中破坏图片链接