.htaccess重写URL导致缺少CSS


10

我正在尝试从中获取我的网址:

example.com/view.php?id=15

对此:

example.com/watch/15

我的代码.htaccess如下:

Options -Indexes
Options +FollowSymlinks
RewriteEngine On
RewriteRule ^watch/([^/]+) view.php?id=$1 [NC]

现在,如果我去example.com/watch/15加载内容,但没有任何JS,则CSS,因为在这种情况下,/watch它将在不存在的文件夹下查找CSS和JS 。

如何使此选项正常工作?我不想创建watch文件夹并复制粘贴CSS和JS,以便将其正确嵌入。


1
使您的JS和CSS引用完整的URL,而不是相对的。
closetnoc

...或包含base引用所有相对URL相对于的基本URL 的元素。@closetnoc,您应该添加它作为答案。
怀特先生

@ w3d也许是因为我不确定您刚才说的是什么,也许您可​​以将其作为答案。;-) 我保证会投票赞成!当雾消散时,我可能会更好地理解它-刚睡了两个晚上,每次睡眠大约5个小时,就从长时间的午睡中醒了过来。
closetnoc

Answers:


10

找不到JavaScript和CSS文件是与您的URL路径相关的客户端/浏览器问题,这不是应该解决的问题.htaccess(至少在这种情况下不应该解决)-尽管这是因为您正在更改此设置.htaccess您遇到此问题的URL路径(在中)。

正如@closetnoc在注释中建议的那样,此问题是由在HTML中使用相对URL引起的。相对于什么?请记住,是用户代理/浏览器来解析HTML中的相对URL,而不是服务器。因此,您需要修复URL。不.htaccess

例如,如果您使用格式相对的 URL href="styles.css"(请注意,没有斜杠前缀)引用CSS文件,并且当前使用的是URL,example.com/view.php?id=15浏览器自然会解析您的CSS URL和请求example.com/styles.css(在文档根目录中)。但是,如果您当前使用的是URL example.com/watch/15(有效地在/watch“子目录” [* 1]中),那么浏览器将解析对于子目录而不是文档根目录的相对 CSS URL ,因此您将获得绝对/已解析的结果表格的网址。/watchexample.com/watch/styles.css

[* 1]注意,在此上下文中,“子目录”不一定是服务器上的物理子目录-它是URL路径中的“子目录”;是一个附加的路径段。但是浏览器并不知道两者之间的区别。 )

如果在自定义错误文档(ErrorDocument在Apache 上的指令定义)中使用相对URL,则同样适用。可以在任何URL上调用自定义错误文档,因此静态资源的任何相对URL(CSS,图像,JS等)都将相对于导致错误的URL,而不是相对于错误文档本身(其位置实际上对用户代理隐藏了)。

如果将JavaScript和CSS URL更改为相对于根(以斜杠开头)或绝对URL,则不会出现此问题。这将是首选方法。或者,您可以使用base元素...

base 标签/元素

另外,您可以baseheadHTML文档的部分中包含一个元素(尽管这并非没有警告[* 2])。这引用了所有相对URL 相对的绝对URL 。换句话说,由于您期望这些相对URL相对于文档根目录,因此请将以下内容添加到该head部分:

<base href="http://example.com/">

现在,相对URL(例如URL styles.css中文档中引用的URL)/watch/15将请求http://example.com/styles.css,而不是http://example.com/watch/styles.css

[* 2]但是,使用base元素有一些注意事项。一个主要的问题是,现在打算将当前文档作为目标的任何相对 URL都将作为目标URL。这可能会影响页内锚点(例如和格式的URL等)以及使用空属性(例如)提交给自己的元素。这些针对当前文档的相对URL将需要进行修改,以包括当前页面的完整URL(这可能会打乱使用标记作为解决方法的起点)。href="#top"href="?sortby=date"formaction<form action="" ...base

参考:


1
是的,一旦我在顶部添加底座,它就会起作用。我浪费了2小时试图解决这个问题,但是却很简单,只需添加1行代码...非常感谢您的翔实回答!
StuckBetweenTrees 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.