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

URL rewriting : css, js, and images not loading

提问人:Bhavesh G 提问时间:10/14/2012 最后编辑:Bhavesh G 更新时间:1/7/2022 访问量:52325

问:

我有以下规则.htaccess

Options +FollowSymLinks

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

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

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

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

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

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

php apache .htaccess mod-rewrite url-rewriting

评论

0赞 mk_89 10/14/2012
您应该根据您的系统使用绝对路径,例如,如果您使用 Linux,它会像这样/var/www/css/
0赞 Carlos 10/16/2012
¿你的 css 和 js 目录到底在哪里?
0赞 Bhavesh G 10/16/2012
他们在 和http://localhost/css/style.csshttp://localhost/js/js.js
0赞 stash_man 7/28/2016
另外,我必须制作一个空目录,在这种情况下,重写的“详细信息”才能正常工作,有没有办法解决它?

答:

24赞 Jon Lin 10/15/2012 #1

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

这是因为相对 URI 的基数已更改。本来基数是当页面是,浏览器会适当地用基数填充相对链接。但是,当浏览器转到一个页面时,就像 base 突然变成一样,它试图将其附加到所有相对 URL 的前面,因此它们都没有加载。//detail.php?id=123//detail/123/detail/

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

<base href="/">

评论

0赞 Bhavesh G 10/15/2012
任何其他解决方案,而不是编辑实际的 PHP、HTML 文件(例如。 文件规则).htaccess
0赞 Basil Musa 5/26/2015
谢谢乔恩。最快、最简洁的解决方案。
0赞 soonic 3/13/2016
这个帮助了我,我不必更改所有脚本或 css 文件的路径。谢谢乔恩。<base href="/project/">
20赞 Anthony Hatzopoulos 10/27/2012 #2

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

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

这应该有效,但我不会走这条路。

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

评论

0赞 Bhavesh G 10/27/2012
你的意思是我应该在我的所有资源中使用“绝对路径”吗?而不是“亲戚”
2赞 Anthony Hatzopoulos 10/29/2012
@BhaveshGangani是,但不是那种有协议和域的,而是这种类型的根目录绝对路径:http://example.com/css/style.css/css/style.css
0赞 Joe 7/9/2019
如果能在正文中澄清评论,那就太好了:)
1赞 Anthony Hatzopoulos 7/18/2019
谢谢@Joe - 我已经做出了改进。
1赞 Perleone 10/28/2012 #3

安东尼的回答是完全有效的,他实际上是在试图传授一些好的做法。

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

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

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

7赞 Sajal 10/1/2013 #4

我在核心 php 中将 url 重写应用于一个项目。我遇到了同样的问题。css、Js 和图像未加载。我用过这个,它对我有用。

# 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]
0赞 danu 8/4/2017 #5

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

RewriteRule ^(.+)/(admin|css|fonts|ico|include|js|images)/(.*)$ $2/$3 [L]
0赞 Jignesh Joisar 6/18/2020 #6

只需排除目录,它就会自动加载,仅此而已

RewriteRule ^(css|js|fonts|images|plugins)($|/) - [L]
0赞 Abdul Aziz 1/7/2022 #7

当我将样式链接从

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

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