You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于.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>

原配置的问题

  1. RewriteCond %{HTTP_HOST} ^www\.%{HTTP_HOST}$是无效规则,%{HTTP_HOST}不能嵌套使用,无法正确匹配带www的域名。
  2. redirectMatch规则会导致不必要的重复跳转,且规则顺序不合理。
  3. 缺少跨域名语言路径的跳转逻辑,无法实现english.com/fr到french.com/fr这类跳转。
  4. 根目录跳转规则会被前面的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 19:10:25