2015-05-06 97 views
0

我有以下htaccess文件。問題是goto page2.php轉到page1.php,像這樣page3.php轉到page1.php。htacces重寫規則衝突與其他網址

Options +FollowSymLinks -MultiViews 
RewriteEngine on 
RewriteBase /bookshow/ 


RewriteCond %{THE_REQUEST} /page1\.php\?name=([^\s&]+) [NC] 
RewriteRule^%1? [R=302,L] 

RewriteCond %{THE_REQUEST} /page2\.php\?id=([^\s&]+) [NC] 
RewriteRule^%1? [R=302,NE,L] 


RewriteCond %{THE_REQUEST} /page3\.php\?cat=([^\s&]+) [NC] 
RewriteRule^%1? [R=302,NE,L] 


RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^([^/]*)/?$ page1.php?name=$1 [L,NE,QSA,NC] 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^([^/]*)/?$ page2.php?id=$1 [L,NE,QSA,NC] 

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^([^/]*)/?$ page3.php?cat=$1 [L,NE,QSA,NC] 
+0

你想做什麼。它確定它在哪裏,但它應該去哪裏? –

+0

page1.php和page3.php工作正常。但是,當GOTO PAGE2.PHP IT LANDS在PAGE1.PHP這是問題。 page2.php必須轉到page2.php – user3680502

+0

什麼是解決方案? – user3680502

回答

2

巴拿馬傑克說,服務器不能簡單地猜測其重寫需要的頁面已經被重定向後,僅僅是因爲您的每個三個規則的模式是完全相同發生。因此,第一條規則將會執行總是,而沒有別的。

爲了解決這個問題,使用下面的代碼來代替:

RewriteEngine on 

RewriteBase /bookshow/ 

# Step 1: Redirect all pagex.php?... to new URIs 

RewriteCond %{QUERY_STRING} cat=([^\s&]+)$ [NC] 
RewriteRule ^page1.php$ cat/%1? [R=302,NE,L] 

RewriteCond %{QUERY_STRING} name=([^\s&]+)$ [NC] 
RewriteRule ^page2.php$ name/%1? [R=302,NE,L] 

RewriteCond %{QUERY_STRING} id=([^\s&]+)$ [NC] 
RewriteRule ^page3.php$ id/%1? [R=302,NE,L] 

# Step 2: Rewrite cat/something, name/something, id/something to the actual pages 

RewriteRule ^cat/([^/]*)/?$ page1.php?cat=$1&r [L,NE,QSA,NC] 
RewriteRule ^name/([^/]*)/?$ page2.php?name=$1&r [L,NE,QSA,NC] 
RewriteRule ^id/([^/]*)/?$ page3.php?id=$1&r [L,NE,QSA,NC] 

進一步說明:

第一步,我們正在檢查什麼查詢字符串,其頁面被訪問。如果匹配,則重定向到新的URI。

例如,page1.php?cat = hello將重定向到cat/hello

然後,在第二步中,我們將這些新的URI重寫到已經存在的頁面,並在查詢字符串後附加&r,以避免重定向循環。這&r基本上是多餘的,並像一個假人。

例如,貓/你好將在內部改寫爲page1.php中?貓=你好&ř

更新:我已經從代碼中移除了RewriteCond %{REQUEST_FILENAME} !-fRewriteCond %{REQUEST_FILENAME} !-d - 這些都是不需要的。如果你需要它們,請隨時將它們放回原處。