我有以下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]
答案 0 :(得分:2)
正如巴拿马杰克所说,服务器不能简单猜测在重定向页面后需要进行哪些重写,只是因为三个规则中每个规则的模式完全相同< / em>的。因此,第一条规则将始终执行,而其他任何内容都不会。
要解决此问题,请改用以下代码:
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&amp; r 。
已更新:我已从代码中删除了RewriteCond %{REQUEST_FILENAME} !-f
和RewriteCond %{REQUEST_FILENAME} !-d
- 这些都不是必需的。如果你需要它们,请随意把它们放回去。