mod_rewrite和尾部斜杠

时间:2012-09-13 01:33:41

标签: php regex .htaccess mod-rewrite

我有

RewriteRule    ^([A-Za-z0-9-_≈]+)/?$    page.php?text=$1

domain.com/sample_text等匹配转换为page.php?text=sample_text

但是,我希望以下两个条件也能正常工作(并给出相同的结果)。

1)如果他们转到domain.com/sample_text/我想在地址栏中保留尾部斜杠并显示page.php?text=sample_text(现在它转到右页但是css和js-path混乱了)。

2)如果他们转到domain.com/sample_text/worthlessdata123我想删除/之后的所有内容,将domain.com/sample_text/保留在地址栏中并显示page.php?text=sample_text

我已经挣扎了很多,但我在正则表达式上很糟糕,而且我的头脑无法正常工作。

2 个答案:

答案 0 :(得分:3)

你所拥有的规则应该足以满足第一个条件。如果有人转到domain.com/sample_text/,则URI sample_text/会匹配并且应该在/page.php?text=sample_text处提供内容,而浏览器的网址地址栏保持不变。

对于第二个条件,您需要添加一个规则来处理:

RewriteRule ^([A-Za-z0-9-_≈]+)/.+$ /$1/ [L,R=301]

这会将domain.com/sample_text/worthlessdata123重定向到domain.com/sample_text/,然后第一条规则应该从那里开始。


误读你的第一个问题。由于额外的斜杠,您在页面内容中的相对/绝对路径获得了不同的基础。当你有类似<img src="images/blah.gif">的东西时,相对基数来自浏览器看到的URL(而不是服务器内部重写的内容)。因此,如果浏览器看到:http://domain.com/sample_text,则URI基数为/,但当浏览器看到http://domain.com/sample_text/时,URI基数变为/sample_text/,我猜测它不是'在某些地方g images/blah.gif居住的地方。

您可以通过在网页标题中加入基数来解决此问题:

<base href="/">

答案 1 :(得分:1)

使用资产的绝对路径(js,图像等)需要解决的第一个问题

对于第二个问题,你需要@Jon Lin的解决方案。