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.css
和http://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
文件规则)
谢谢乔恩。最快最整洁的解决方案。
这个帮助了我<base href="/project/">
,我不必更改所有脚本或 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" />
转入<link href="/css/styles.css" rel="stylesheet" />
【讨论】:
以上是关于URL 重写:css、js 和图像未加载的主要内容,如果未能解决你的问题,请参考以下文章
使用 php 和 .htaccess 进行友好的 url 重写。与 css 图像和 js 的相对链接的困难