.htaccess多语言站点RewriteRule重写规则冲突配置问题求解
问题根源
- 规则优先级错误:原配置把单语言内容页重写规则放在多语言规则前面,会优先截取路径片段,比如
/en/会被第一条规则匹配成id=en,/en/profile.php会被先匹配到文件名片段触发错误重写 - 规则逻辑错误:原多语言规则直接把语言段后面的路径拼接到根路径,没有区分真实实体文件和需要转发到
page.php的内容页,且首个查询参数错误使用&拼接,未使用查询参数起始符?,会导致参数无法被程序识别 - 场景覆盖缺失:没有单独处理带语言前缀的根路径(如
/en/)场景,「非真实目录/文件才重写」的判断仅作用在第一条规则上,真实存在的PHP文件会被误拦截
正确.htaccess配置
RewriteEngine On ErrorDocument 404 /error # 处理带语言前缀的首页路径 如 /en/ RewriteRule ^(en|es|ar|fr|de|ru|pt-br)/?$ /?lang=$1 [L] # 处理带语言前缀的实体PHP文件 如 /en/profile.php RewriteRule ^(en|es|ar|fr|de|ru|pt-br)/([^/]+\.php)$ /$2?lang=$1 [L] # 处理带语言前缀的内容页 如 /en/about RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(en|es|ar|fr|de|ru|pt-br)/(.+?)/?$ /page.php?id=$2&lang=$1 [L] # 处理默认语言(无语言前缀)的内容页 如 /about RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^([^/]+)$ /page.php?id=$1 [L]
匹配效果校验
- 访问
website.com/:不触发任何重写,直接访问站点首页 - 访问
website.com/en/:匹配首页语言规则,重写到/?lang=en - 访问
website.com/en/profile.php:匹配实体文件语言规则,重写到/profile.php?lang=en,不会被误判为内容页 - 访问
website.com/about:匹配默认语言内容页规则,重写到/page.php?id=about - 访问
website.com/en/about:匹配多语言内容页规则,重写到/page.php?id=about&lang=en
注:原需求示例中
website.com/en/about的目标路径漏写了lang参数值,上述配置会自动传入对应语言标识,可直接被后端程序读取。
内容的提问来源于stack exchange,提问作者yortem
相关产品推荐
相关产品推荐

