apache重写不按预期工作

时间:2013-05-10 08:16:26

标签: apache mod-rewrite

我试图得到它,以便它将url重写为php的变量,

到目前为止,我有:

RewriteEngine On
RewriteRule ^sub/(.*).html$ index.php?sub=$1
RewriteRule ^(.*).html$ index.php?page=$1

/ sub / one工作得很好,虽然第一页不起作用,

抱歉,重写规则的初学者,

可以解决一些问题吗?我猜这个问题是你不能像我一样堆叠重写规则......

我不能以任何方式改变目录结构,所以这是我必须使用的:

page.html
page2.html
sub/123.html
sub/827.html

先谢谢!

〜Jmyeom

修改

在规则末尾添加[NC,L]解决了这个问题,

RewriteEngine On
RewriteRule ^sub/(.*).html$ index.php?sub=$1 [NC,L]
RewriteRule ^(.*).html$ index.php?page=$1 [NC,L]

虽然,现在,我怎么做到它不会重写不是/ sub /的不同子文件夹,即/ src /?

再次感谢 〜Jmyeom

2 个答案:

答案 0 :(得分:1)

如果我理解了最后一个问题(在编辑之后),你想限制第二次重写,以便它只会重写页面,而不是重写其他子目录?

您可以通过将匹配的文字更改为“/以外的任何字符”来实现:

RewriteRule ^([^/]*)\.html$ index.php?page=$1 [NC,L]

在正则表达式中,[ ]匹配任何指定的字符,如果您将^放在开头,它会匹配不介于方括号之间...所以这里我们匹配任何不是斜线的东西。

答案 1 :(得分:0)

如果你的URI结构真的像这样:

/page.html
/page2.html
/sub/123.html
/sub/827.html

然后你的规则应该是:

RewriteRule ^/sub/(.*).html$ index.php?sub=$1 [NC,L]
RewriteRule ^/(.*).html$ index.php?page=$1 [NC,L]

否则我会用它来消除不必要的重写:

RewriteRule ^/.*/sub/(.*).html$ index.php?sub=$1 [NC,L]
RewriteRule ^/.*/(.*).html$ index.php?page=$1 [NC,L]

要排除模式,您可以执行此操作:

RewriteCond %{REQUEST_URI} !^/src/
RewriteRule ^/(.*).html$ index.php?page=$1 [NC,L]

另请注意,默认情况下,上述规则将执行302(临时重定向)。大多数人真的想要301(永久重定向),特别是如果他们关心SEO。 [R=301,NC,L]