Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php htacces重写规则与其他url冲突_Php_.htaccess - Fatal编程技术网

Php htacces重写规则与其他url冲突

Php htacces重写规则与其他url冲突,php,.htaccess,Php,.htaccess,我有以下htaccess文件。问题是,当转到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] Rewri

我有以下htaccess文件。问题是,当转到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\u FILENAME}-f
重写cond%{REQUEST_FILENAME}-d代码中的代码-这些代码是不需要的。如果您需要它们,请随时将它们放回原处。

您想做什么。它可以去哪里,但它必须去哪里?page1.php和page3.php工作正常。但是,当转到PAGE2.PHP时,它会登陆到PAGE1.PHP,这就是问题所在。page2.php必须转到page2.php解决方案是什么?所有重写规则的条件都相同。当您对任何URI请求都有3条规则检查时,服务器如何知道您请求的页面?重写规则^([^/]*)/?$@PanamaJack So。。。解决办法是什么?