【问题标题】:Mod-rewrite Trailing Slash IssueMod-rewrite 斜杠问题
【发布时间】:2008-11-25 01:48:33
【问题描述】:

关于这个主题似乎没有太多信息,所以我将概述我的具体问题,然后也许我们可以将问题和答案塑造成更普遍的东西。

我有这个重写规则

RewriteEngine On
RewriteBase /bookkeepers/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)/?$ index.php?franchise=$1

这个网址的变化是什么

http://example.com/location/kings-lynn

进入这个

http://example.com/location/index.php?franchise=kings-lynn

我遇到的问题是,如果我添加一个斜杠

http://example.com/location/kings-lynn/

然后查询字符串返回为

franchise=kings-lynn/

由于某种原因,我的 CSS 和 Javascript 文件都没有被加载。

有什么想法吗?

【问题讨论】:

  • 我已经发布了一个关于正则表达式匹配的答案。要修复 CSS/Javascript 问题,您应该查看服务器日志以查看请求的内容。您可能必须在该 RewriteRule 中添加一个 [R,L],但我从来没有理解这部分。

标签: mod-rewrite


【解决方案1】:

正如@Paul Tomblin 所说, .+ 是贪婪的;也就是说,它尽可能地匹配。

^(.+[^/])/?$ 告诉它匹配任何内容,后跟一个不是 / 的字符,然后是可选的 /。这具有不捕获尾随 / 的效果。

您的 CSS 和 Javascript 不起作用的最可能原因是您使用了相对路径,例如 src="my.js"。当尾部有斜线时,它看起来像一个目录,因此您的浏览器将查找 /location/kings-lynn/my.js。您可以通过使用文件的绝对路径(例如 /location/my.js)来解决此问题。

【讨论】:

    【解决方案2】:

    看起来 (.+) 正在被贪婪匹配。这种情况,你可以试试

    RewriteRule ^(.+[^/])/?$ index.php?franchise=$1
    

    这确保第一组(在括号中)不以斜线结尾。

    【讨论】:

    • 不错。这解决了我的斜杠问题(但不是缺少 CSS 问题)。不要以为您可以谈论它是如何工作的吗?
    • 正则表达式匹配由 1 个或多个任意字符组成的组,后跟除斜杠以外的任意字符。在组之外,您可以选择匹配斜线。在我更改之前,斜线可能已在组中结束。
    猜你喜欢
    • 2012-07-14
    • 1970-01-01
    • 1970-01-01
    • 2017-02-19
    • 2011-12-05
    • 2012-07-25
    • 2010-12-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多