如何在.htaccess中根据URL是否含语言前缀配置不同的RewriteRules重写规则?
如何在.htaccess中根据URL是否含语言前缀配置不同的RewriteRules重写规则?
嘿,我完全懂你的痛点——没法直接在.htaccess里读取数据库的语言配置,只能靠URL里的语言前缀来区分规则是吧?别急,我们可以通过规则优先级+精准正则匹配来实现这个需求,下面是具体的配置和细节说明:
首先,先确保你的.htaccess开头开启了重写引擎:
RewriteEngine On
第一步:处理带语言前缀的URL
我们先处理包含语言前缀的情况(比如/nl/home这类),规则要从最长的URL格式开始往下写,避免短格式提前匹配导致长格式失效:
# 匹配格式:/语言码/页面/标题/起始位置/(末尾带斜杠) RewriteRule ^([a-z]{2})/([^/]*)/([^/]*)/([^/]*)/$ /index.php?taal=$1&page=$2&title=$3&beginnenbij=$4 [L] # 匹配格式:/语言码/页面/标题/(末尾带斜杠) RewriteRule ^([a-z]{2})/([^/]*)/([^/]*)/$ /index.php?taal=$1&page=$2&title=$3 [L] # 匹配格式:/语言码/标题/(末尾带斜杠) RewriteRule ^([a-z]{2})/([^/]*)/$ /index.php?taal=$1&title=$2 [L]
这里的[a-z]{2}是匹配两位小写字母的语言码(比如nl、en),如果你的语言码有更长的格式(比如zh-CN),可以改成[a-z-]{2,5};如果语言码是固定的几个(比如只有nl、en、de),直接写^(nl|en|de)会更精准,避免误匹配其他开头的URL,比如:
RewriteRule ^(nl|en|de)/([^/]*)/([^/]*)/([^/]*)/$ /index.php?taal=$1&page=$2&title=$3&beginnenbij=$4 [L]
第二步:处理不带语言前缀的URL
处理完带前缀的情况后,剩下的就是不带语言前缀的URL了,直接用你提供的规则即可,同样注意从长格式到短格式的顺序:
# 匹配格式:/页面/标题/起始位置/ 或 /页面/标题/起始位置(末尾可带/可不带) RewriteRule ^([^/]+)/([^/]+)/([^/]+)/?$ /index.php?page=$1&title=$2&beginnenbij=$3 [QSA,L] # 匹配格式:/页面/标题/ 或 /页面/标题(末尾可带/可不带) RewriteRule ^([^/]+)/([^/]+)/?$ /index.php?page=$1&title=$2 [QSA,L] # 匹配格式:/标题/ 或 /标题(末尾可带/可不带) RewriteRule ^([^/]+)/?$ /index.php?title=$1 [QSA,L]
关键注意点
- 规则顺序绝对不能乱:一定要先处理带语言前缀的规则,再处理不带的;而且每种情况都要从最长的URL格式开始写,因为RewriteRule是从上到下匹配,一旦匹配到带
[L]标记的规则就会停止后续处理。 [L]标记的作用:表示“Last”,匹配当前规则后就不再执行后面的规则,避免规则冲突。[QSA]标记的作用:在不带前缀的规则里用到了它,它会保留原URL的查询字符串,比如用户访问cms2024.nl/home?foo=bar,重写后会变成index.php?title=home&foo=bar,这对带参数的请求很友好。
测试建议
你可以通过以下几种URL来验证规则是否生效:
- 带语言前缀的短URL:
cms2024.nl/nl/home→ 应该重写到index.php?taal=nl&title=home - 不带语言前缀的短URL:
cms2024.nl/home→ 应该重写到index.php?title=home - 带语言前缀的长URL:
cms2024.nl/nl/products/laptop/10/→ 应该重写到index.php?taal=nl&page=products&title=laptop&beginnenbij=10
备注:内容来源于stack exchange,提问作者Jarno Gombert
相关产品推荐
相关产品推荐

