URL 重写:css、js 和图像未加载

Posted

技术标签:

【中文标题】URL 重写:css、js 和图像未加载【英文标题】:URL rewriting : css, js, and images not loading 【发布时间】:2012-10-04 16:45:00 【问题描述】:

我遵循.htaccess 的规则

Options +FollowSymLinks

RewriteEngine On
RewriteBase /
RewriteCond %REQUEST_FILENAME -f [OR]

RewriteRule ^detail/([0-9]+)/?$ detail.php?id=$1

它将http://localhost/detail/123 URL 重定向到http://localhost/detail.php?id=123。页面重定向成功,但问题是CSS, JS, and images没有加载,

CSS、js文件位于http://localhost/css/http://localhost/js/

一种解决方案是使用绝对路径(例如 /CSS 或 /js 而不仅仅是 CSS/、/js,但这似乎不是一个可靠的解决方案,因为我们必须全部更改它文件,

基于.htaccess规则的任何其他解决方案,它独立于编辑所有PHP文件并让我们使用“相对路径”?

【问题讨论】:

您应该根据您的系统使用绝对路径,例如如果您使用 linux,则类似于 /var/www/css/ ¿您的 css 和 js 目录到底在哪里? 他们在http://localhost/css/style.csshttp://localhost/js/js.js 另外我必须创建一个空目录,在这种情况下是“详细信息”以便重写工作,有没有办法解决它? 【参考方案1】:

一种解决方案是使用绝对路径(例如 /css 或 /js 而不仅仅是 css/、/js,但这看起来不是一个可靠的解决方案,因为我们必须在所有文件上更改它,

这是因为您的相对 URI 的基数已更改。原来,当页面为/detail.php?id=123时,base为/,浏览器正确填写了/base的相关链接。但是当浏览器转到像/detail/123 这样的页面时,基础突然变为/detail/,它会尝试将其附加到所有相对 URL 的前面,因此它们都不会加载。

您可以将链接设为绝对链接,也可以更改页面标题中的 URI 基础(在 <head> </head> 标签之间):

<base href="/">

【讨论】:

任何其他解决方案,而不是编辑实际的 php、html 文件(例如 .htaccess 文件规则) 谢谢乔恩。最快最整洁的解决方案。 这个帮助了我&lt;base href="/project/"&gt;,我不必更改所有脚本或 css 文件的路径。谢谢乔恩。【参考方案2】:

不要偷懒,将资源中的相对 URI 更改为根目录绝对路径,例如 /css/style.css。这是最好的。

您可以变得聪明并使用正则表达式并替换您需要的所有文件,这就像几条衬里一样,您就完成了。有多少地方可以改变?而且您应该使用模板。

这应该可行,但我不会这样做。

RewriteRule ^detail/(css|js|img)/(.*)?$ /$1/$2 [L,QSA,R=301]

【讨论】:

您的意思是我应该在所有资源中使用“绝对路径”吗?而不是“亲戚” @BhaveshGangani 有点像,但不是那种协议和域http://example.com/css/style.css,而是这种根目录绝对路径:/css/style.css 在正文中有评论澄清会很棒:) 谢谢@Joe - 我已经做出了改进。【参考方案3】:

我将 url 重写应用于核心 php 中的项目。我遇到了同样的问题。 css、Js 和图像没有被加载。我使用了它,它对我有用。 Source

# Allow any files or directories that exist to be displayed directly
RewriteCond $REQUEST_URI ^.+$
RewriteCond %REQUEST_FILENAME \.(gif|jpe?g|png|js|css|swf|php|ico|txt|pdf|xml)$ [OR]
RewriteCond %REQUEST_FILENAME -f [OR]
RewriteCond %REQUEST_FILENAME -d [OR]
RewriteCond %REQUEST_FILENAME -l
RewriteRule ^ - [L]

【讨论】:

【参考方案4】:

Anthony 的回答是完全正确的,他实际上是在尝试在那里传授一些好的做法。

但是,由于您似乎对这个答案并不满意,所以这里有一个不同的解决方案。只需在任何 Rewrite-Command 之前将此行插入 .htaccess:

RedirectMatch permanent ^/detail/((css|js)/.*)  /$1

它将所有最初对 /details/css/style.css 和 /details/js/js.s 的 404 请求重定向到它们的实际位置。既不漂亮也不优雅,但它确实有效。

【讨论】:

【参考方案5】:

这段代码非常适合我,在重定向规则之前添加(RewriteRule ^detail/([0-9]+)/?$ detail.php?id=$1)

RewriteRule ^(.+)/(admin|css|fonts|ico|include|js|images)/(.*)$ $2/$3 [L]

【讨论】:

【参考方案6】:

只需排除它会自动加载的目录

RewriteRule ^(css|js|fonts|images|plugins)($|/) - [L]

【讨论】:

【参考方案7】:

当我更改样式链接时,我的问题解决了

 <link href="css/styles.css" rel="stylesheet" />

转入&lt;link href="/css/styles.css" rel="stylesheet" /&gt;

【讨论】:

以上是关于URL 重写:css、js 和图像未加载的主要内容,如果未能解决你的问题,请参考以下文章

使用 php 和 .htaccess 进行友好的 url 重写。与 css 图像和 js 的相对链接的困难

Codeigniter CSS、JS 和图像未加载,可能假定为目录

CSS背景图像未加载

图像,CSS和JS未在MVC4应用程序中加载

RewriteRules 不加载某些 css。 js和图片

下一个 JS 和 Cloudinary,图像未加载