2013-05-10 47 views
0

我试图使其重写URL转化为PHP变量得到它,的Apache的rewrite工作不正常

到目前为止,我有:

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

的/子/一个是工作完美的罚款,尽管该页面一个不工作,

对不起,初学者在重写规则,

可以在任何提供一些线索?我猜测的问题是,你不能叠加重写规则像我有...

我不能以任何方式更改目录结构,所以这是我与合作:

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

+0

只需要注意,将“[L]”添加到规则意味着如果匹配,它将成为运行的最后一条规则。 – icabod 2013-05-10 12:18:37

回答

1

如果我理解最后一个问题(在您编辑后),要限制第二重写,这样只会重写网页,但是不能改写其他子目录?

你可以通过改变多数民众赞成匹配的文本是“除外/任何字符”:

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

在正则表达式中,[]匹配任何指定的字符,如果你把^在开始时,它匹配不包括之间的任何字符......所以在这里我们匹配任何不是斜杠。

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(永久重定向),特别是如果他们关心搜索引擎优化。 [R=301,NC,L]