htaccess 中的多个 RewriteRule 不起作用

htaccess 中的多个 RewriteRule 不起作用

我很清楚这类问题已经被问过很多次了,但我认为我的问题不同。我是新手.htaccess

RewriteEngine On 
RewriteBase /

RewriteCond %{HTTP_HOST} ^localhost/index.php
RewriteRule (.*) localhost/index.php [R=301,L]

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ leather-product.php?n=$1 [QSA,L]

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^bagsgentssel1/([0-9]+)$ bagsgentssel1.php?h=$1 [L] 

# RewriteRule . /index.php [L]
# RewriteRule ^bagsgentssel1/([0-9]+)$ bagsgentssel1.php?h=$1 [QSA,L]
# RewriteRule ^(.*)$ leather-product.php?n=$1 [QSA,L]

当我运行我的代码时RewriteRule ^(.*)$ leather-product.php?n=$1 [QSA,L],它工作正常。但是当我尝试运行第二条规则时RewriteRule ^bagsgentssel1/([0-9]+)$ bagsgentssel1.php?h=$1 [L],它不起作用。这里没有显示任何错误,并且在 chrome 浏览器中 URL 显示为http://localhost/bagsgentssel1/45

有趣的是,如果我在下面评论代码,那么第二段就RewriteRule ^bagsgentssel1/([0-9]+)$ bagsgentssel1.php?h=$1 [L]可以正常工作。

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ leather-product.php?n=$1 [QSA,L]

我找不到我错在哪里?

答案1

你的指令顺序不对。你需要更多具体的指令。

RewriteRule ^(.*)$ leather-product.php?n=$1 [QSA,L]

你的第一条规则捕捉到了一切(使用模式^(.*)$),因此您的第二条规则实际上从未达到。您需要进行上述操作RewriteRule 图案更具体(例如,仅匹配数字或其他内容),这样它就不会与第二条规则冲突。或者反转您的两条规则,先使用第二条(更具体)规则:

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^bagsgentssel1/([0-9]+)$ bagsgentssel1.php?h=$1 [L] 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ leather-product.php?n=$1 [QSA,L]

有趣的是,如果我在下面评论代码,那么第二段就RewriteRule ^bagsgentssel1/([0-9]+)$ bagsgentssel1.php?h=$1 [L]可以正常工作。

确实,您正在删除冲突/捕获一切的指令。

mod_rewrite 指令从上到下进行处理。如果文件顶部的指令捕获了请求,则后面的所有指令都将被跳过。

如果你没有其他指令那么上面的内容可以重写:

RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]

RewriteRule ^bagsgentssel1/([0-9]+)$ bagsgentssel1.php?h=$1 [L] 

RewriteRule ^(.*)$ leather-product.php?n=$1 [QSA,L]

在旁边:

RewriteCond %{HTTP_HOST} ^localhost/index.php
RewriteRule (.*) localhost/index.php [R=301,L]

我不确定这应该做什么,但它实际上没有做任何事情(状况永远不会匹配)。尽管如果匹配了,看起来休息

相关内容