apache通过mod_rewrite将?lang=zh&action=about转为/zh/about,需启用rewrite模块、配置allowoverride all,用正则排除带点路径,并支持accept-language自动跳转及内部转发保留参数。

Apache URL 重写实现多语言路径,核心是把 ?lang=zh&action=about 这类带参数的 URL 转成 /zh/about 这样的语义化路径,并让服务器能正确识别语言、转发请求,同时兼顾浏览器自动跳转和静态资源不被误伤。
确保基础环境可用
先确认 mod_rewrite 已启用且 .htaccess 可生效:
- 运行
sudo a2enmod rewrite启用模块,再sudo systemctl restart apache2 - 检查站点配置(如
/etc/apache2/sites-available/000-default.conf),确保对应目录块中包含:AllowOverride AllRequire all granted - 网站根目录下存在
.htaccess文件,且首行必须是RewriteEngine On
区分真实文件与语言路径
避免把 /images/logo.png 或 /css/style.css 错误重写成语言路由——关键在于排除带点(.)的路径:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 用
RewriteCond %{REQUEST_FILENAME} !-f和!-d判断是否为真实文件或目录(稳妥但略慢) - 更高效的做法是直接匹配「不含点」的路径:
RewriteRule ^([a-z]{2})(?:/([^?]*))?$ index.php?lang=$1&page=$2 [L,QSA]
这条规则只匹配类似/en、/zh/about的路径,而/en/logo.png因含.自动不匹配,直接走原文件
支持浏览器语言自动跳转
用户首次访问 / 时,根据 Accept-Language 头跳转到对应语言版本:
- 添加条件判断:
RewriteCond %{HTTP:Accept-Language} ^zh.*$ [NC]RewriteRule ^$ /zh/ [R=302,L] - 可叠加多个条件覆盖主流语言:
RewriteCond %{HTTP:Accept-Language} ^en.*$ [NC]RewriteRule ^$ /en/ [R=302,L]RewriteCond %{HTTP:Accept-Language} ^ja.*$ [NC]RewriteRule ^$ /ja/ [R=302,L] - 注意:首次用
302测试,确认无误后再换301;顺序很重要,靠前的规则优先匹配
内部转发与参数解析
用户访问 /en/contact 时,Apache 需悄悄转给 PHP 处理,不改变地址栏:
- 主转发规则示例(放在最后):
RewriteRule ^([a-z]{2})/(.*)$ index.php?lang=$1&page=$2 [L,QSA]RewriteRule ^([a-z]{2})$ index.php?lang=$1 [L,QSA] -
[QSA]保留原始查询参数(如/en/search?q=test→index.php?lang=en&page=search&q=test) - PHP 中可通过
$_GET['lang']和$_GET['page']获取,无需改动业务逻辑










