htacces重写规则与其他url冲突

时间:2015-05-06 13:13:27

标签: php .htaccess

我有以下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]

1 个答案:

答案 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} !-fRewriteCond %{REQUEST_FILENAME} !-d - 这些都不是必需的。如果你需要它们,请随意把它们放回去。