htaccess重写打破了相对路径

时间:2010-10-10 10:47:51

标签: .htaccess mod-rewrite url-rewriting

我有一个htaccess文件,用于将

http://www.myserver.com/home/
映射到
http://www.myserver.com/index.php?section=home

这部分工作正常。我现在面临的问题是,我的所有图片和CSS都位于名为assets的子文件夹中,即

http://www.myserver.com/assets/images/
http://www.myserver.com/assets/css/
等。

重定向后,浏览器会查找

http://www.myserver.com/home/assets/images/
下的文件 这会导致事情中断,因为这不是一个有效的路径。

我已经能够添加另一个重写,将上面的内容映射到正确的子文件夹,但是,Firebug显示图像位于:

http://www.myserver.com/home/assets/images/

我知道这不是一个真正的问题,毕竟,我的图像和CSS正在加载这个规则。 我只是好奇如何使路径显示为实际路径,即:

http://www.myserver.com/assets/images/

在下面粘贴我的htaccess文件。非常感谢你。

Options +FollowSymlinks
RewriteEngine on
RewriteRule ^([^/]+)/assets/(css|images|js)/(.*)$ /assets/$2/$3 [NC,L]
RewriteRule ^([^/]+)/$ /index.php?section=$1 [NC,L]

2 个答案:

答案 0 :(得分:16)

问题在于您没有考虑在基URI上解析相对URL,该基URI是使用引用的HTML文档的URI。因此,HTML文档中的相对URI路径如assets/images/ URI路径/home/已解析为/home/assets/images/而不是/assets/images/

您无法使用mod_rewrite更改此设置,因为URI解析由客户端完成,而不是由服务器完成。唯一的解决方案是:

  • 使用BASE element更改基本URI(请注意,这会影响所有相对URI);
  • 使用绝对URI路径,例如/assets/images/代替亲戚assets/images/;
  • 调整相对URI路径,因此/home/中的引用会调整为../assets/images/以反映路径深度。

答案 1 :(得分:8)

将此行<BASE href="http://www.yoursitename.com/">添加到<head>标记内的页面中,如下所示:

<head>
        <title>Your site title</title>
        <BASE href="http://www.yoursitename.com/">
....
</head>