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
匹配第三条规则。并且(遵循相同的模式)第三条规则也匹配 /
(因此是您最初的问题)。我的观点是......每条规则的最后一个路径段应该是可选的吗?
尝试重写 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
匹配第三条规则。并且(遵循相同的模式)第三条规则也匹配 /
(因此是您最初的问题)。我的观点是......每条规则的最后一个路径段应该是可选的吗?