基于.htaccess实现双域名多语言跳转及静态资源忽略配置求助
多域名语言跳转的正确.htaccess配置
问题概述
现有目录结构如下:
. ├── assets │ └── img/ │ └── foo.png ├── en │ └── index.php └── fr └── index.php
绑定两个域名:
- english.com
- french.com
需要实现以下跳转规则:
- 访问
english.com自动跳转到english.com/en - 访问
french.com自动跳转到french.com/fr - 访问
english.com/fr自动跳转到french.com/fr - 访问
french.com/en自动跳转到english.com/en
同时,assets目录下的资源无需跳转,比如english.com/assets/img/foo.png和french.com/assets/img/foo.png保持原路径访问。
当前使用的.htaccess配置存在错误,无法正常实现需求,原配置如下:
<IfModule mod_rewrite.c> RewriteEngine On # no www, https only RewriteCond %{SERVER_PORT} !^443$ [OR] RewriteCond %{HTTP_HOST} ^www\.%{HTTP_HOST}$ RewriteRule (.*) https://%{HTTP_HOST}/$1 [R=301,L] RewriteRule ^(en) - [L] RewriteRule ^(fr) - [L] RewriteRule ^(assets) - [L] redirectMatch 301 ^/en$ https://english.com/en redirectMatch 301 ^/fr$ https://french.com/fr RewriteCond %{HTTP_HOST}: englisch.com$ [NC] RewriteRule ^(.*)$ https://%{HTTP_HOST}/en/$1 [R=301,L] RewriteCond %{HTTP_HOST} french.com$ [NC] RewriteRule ^(.*)$ https://french.com/fr/$1 [R=301,L] </IfModule>
原配置的问题
RewriteCond %{HTTP_HOST} ^www\.%{HTTP_HOST}$是无效规则,%{HTTP_HOST}不能嵌套使用,无法正确匹配带www的域名。redirectMatch规则会导致不必要的重复跳转,且规则顺序不合理。- 缺少跨域名语言路径的跳转逻辑,无法实现
english.com/fr到french.com/fr这类跳转。 - 根目录跳转规则会被前面的
RewriteRule ^(en) - [L]等规则阻断,无法触发根路径跳转。
正确配置方案
<IfModule mod_rewrite.c> RewriteEngine On # 强制HTTPS并移除www前缀 RewriteCond %{HTTPS} off [OR] RewriteCond %{HTTP_HOST} ^www\. [NC] RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ [NC] RewriteRule ^ https://%1%{REQUEST_URI} [R=301,L,NE] # 跳过assets目录的所有跳转规则 RewriteRule ^assets/ - [L] # 处理english.com下的fr路径跳转至french.com/fr RewriteCond %{HTTP_HOST} ^english\.com$ [NC] RewriteRule ^fr/(.*)$ https://french.com/fr/$1 [R=301,L,NE] # 处理french.com下的en路径跳转至english.com/en RewriteCond %{HTTP_HOST} ^french\.com$ [NC] RewriteRule ^en/(.*)$ https://english.com/en/$1 [R=301,L,NE] # 处理english.com根路径跳转至english.com/en RewriteCond %{HTTP_HOST} ^english\.com$ [NC] RewriteRule ^$ https://english.com/en/ [R=301,L,NE] # 处理french.com根路径跳转至french.com/fr RewriteCond %{HTTP_HOST} ^french\.com$ [NC] RewriteRule ^$ https://french.com/fr/ [R=301,L,NE] </IfModule>
配置说明
- HTTPS与www处理:通过正则提取不带www的域名,强制跳转至HTTPS无www地址,
NE标记确保URL中的特殊字符不会被转义。 - assets目录跳过:直接匹配
^assets/路径,停止后续规则处理,保证静态资源正常访问。 - 跨域名语言跳转:针对当前域名判断,匹配对应语言子路径,跳转到目标域名的同语言路径,同时保留后续的URL参数或子路径。
- 根目录跳转:仅当访问域名根路径(空路径)时触发跳转,避免对已存在的
/en或/fr路径造成重复跳转。
内容的提问来源于stack exchange,提问作者endo.anaconda
相关产品推荐
相关产品推荐

