如何使用mod_rewrite避免此错误?

时间:2012-09-09 17:19:47

标签: .htaccess mod-rewrite

我在Windows上的XAMPP上运行了一个站点。该站点的根目录位于localhost / sitename /.

我使用.htaccess和mod_rewrite使index.php?app = appname出现在sitename / appname /或sitename / appname。

当我通过sitename / appname访问应用程序时(没有斜杠),一切都很好。浏览器在sitename / assets / ..找到我的图像和CSS,因为它们是相对于当前页面找到的。

问题是,当我通过sitename / appname /(带斜杠)访问某个应用时,浏览器找不到我的资产文件夹,因为它现在正试图查看sitename / appname / assets /。

如果没有mod重写assets文件夹,我该怎么做才能解决这个问题?

3 个答案:

答案 0 :(得分:2)

  

问题是,当我通过sitename / appname /(带斜杠)访问某个应用时,浏览器找不到我的资产文件夹,因为它现在正试图查看sitename / appname / assets /。

尾部斜杠正在改变相对URI的基础。如果不使用mod_rewrite voodoo来解决此问题,则需要使用<base>标记在页眉中添加正确的基数:

<base href="/sitename/appname/">

或任何适当的基础应该是。

答案 1 :(得分:1)

我猜测如果没有斜杠,浏览器认为当前目录为/sitename/,而使用斜杠,浏览器会认为当前目录为/sitename/appname/

因此,假设任何具有相对路径(不以正斜杠开头)的资产(例如"assets/image.png")将基于当前目录。要解决此问题,您可以通过使用正斜杠启动路径,将所有资产路径更改为锚定到根的绝对路径,因此前一个示例将变为"/sitename/assets/image.png"。但我认为,尽管您希望避免重写资产路径,但以下内容更为简单:

RewriteRule ^/sitename/appname/assets/(.+)$ /sitename/assets/$1

这将捕获对不存在的appname/assets路径的任何丢失请求,并将它们引用到正确的/sitename/assets路径。

答案 2 :(得分:0)

看看在使用地址www.example.com/permalink-to-post/在index.php上查看帖子时WordPress如何处理这个问题,似乎最好的答案是使用绝对文件路径到所有链接,图像和CSS。

在这种情况下,/ assets /文件夹的每个链接都应为http://localhost/sitename/assets/。 (直到该站点在实时Web服务器上)