我很清楚这类问题已经被问过很多次了,但我认为我的问题不同。我是新手.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]
我不确定这应该做什么,但它实际上没有做任何事情(状况永远不会匹配)。尽管如果匹配了,看起来休息。