2013-05-10 51 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]