url 问题的 htaccess 根

htaccess root of url issue

尝试重写 url 中的 3-1 个路径,然后重写索引。可以通过以下方式实现前者:

RewriteCond %{HTTP_HOST} ^www.domain.com$ [NC]
RewriteRule ^([^/]+)/([^/]+)/([^/]+)?$ /index.php?a=&b=&c= [L,QSA,NC]
RewriteRule ^([^/]+)/([^/]+)?$ /index.php?a=&b= [L,QSA,NC]
RewriteRule ^([^/]+)?$ /index.php?a= [L,QSA,NC]

想在此之后添加从索引(例如“www.domain.com”)到 /index.php?a=10 的重写,但无法完成这项工作。

RewriteRule ^([^/]+)?$ /index.php?a= [L,QSA,NC]

“问题”是最后一条规则也匹配一个空的 URL-path 因此请求被重写为 /index.php?a= 并且任何后面匹配根的规则都不会被处理。

您可以将其添加到现有规则之前,而不是在现有规则“之后”编写规则来匹配根,以避免冲突。例如:

RewriteRule ^$ /index.php?a=10 [QSA,L]
: other rules follow...

RewriteCond %{HTTP_HOST} ^www.domain.com$ [NC]
RewriteRule ^([^/]+)/([^/]+)/([^/]+)?$ /index.php?a=&b=&c= [L,QSA,NC]
RewriteRule ^([^/]+)/([^/]+)?$ /index.php?a=&b= [L,QSA,NC]
RewriteRule ^([^/]+)?$ /index.php?a= [L,QSA,NC]

请注意,RewriteCond 指令仅适用于第一个 RewriteRule 指令。你真的需要这个吗?

您的规则有点模棱两可,因为在每个正则表达式中您都允许最后一个路径段是可选的。这基本上意味着尾部斜杠是可选的(例如 /foo/bar//foo/bar 根据这些规则都是有效的 URL)。如果您没有在最后一条规则中将路径段设为可选,那么您可以将您的规则放置在最后一个匹配根的位置,就像您最初想要做的那样。

/foo/bar/baz 的请求与第一条规则匹配。 /foo/bar/(带尾部斜线)也匹配第一条规则,但 /foo/bar(无尾部斜线)匹配第二条规则。同样,/foo/ 也匹配第二条规则,但 /foo 匹配第三条规则。并且(遵循相同的模式)第三条规则也匹配 / (因此是您最初的问题)。我的观点是......每条规则的最后一个路径段应该是可选的吗?