[英]htacces rewrite rule conflict with other url
我有以下htaccess文件。 問題是當goto page2.php轉到page1.php時,例如page3.php轉到page1.php。
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]
正如巴拿馬傑克(Panama Jack)所說,服務器無法簡單地猜測頁面重定向后需要進行哪種重寫,這僅僅是因為三個規則中的每個規則的模式都完全相同 。 這樣,第一個規則將始終執行,而其他任何規則都不會執行。
要解決此問題,請改用以下代碼:
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
是多余的,並且像一個虛擬角色。
例如, cat / hello將在內部重寫為page1.php?cat = hello&r 。
更新:我也從代碼中刪除了RewriteCond %{REQUEST_FILENAME} !-f
和RewriteCond %{REQUEST_FILENAME} !-d
- RewriteCond %{REQUEST_FILENAME} !-d
不需要這些。 如果您需要它們,可以隨時將它們放回原處。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.