如何在.htaccess中根据URL语言参数编写ErrorDocument指令
多语言站点动态匹配对应语言404页面配置方法
ErrorDocument是Apache的静态核心指令,服务启动加载配置时就会固定跳转路径,没法直接动态提取URL里的语言标识,得配合mod_rewrite规则或者轻量路由脚本实现,下面是两种可直接落地的方案:
方案1:纯.htaccess规则实现(无需后端脚本)
前提是你所有语言的404页面路径遵循统一命名规则,比如都放在/404/[语言标识].html路径下(比如英文对应/404/en.html、简体中文对应/404/zh.html、日文对应/404/ja.html),直接把下面的配置替换你原来的内容即可:
RewriteEngine On # 从URL开头提取语言标识,存入环境变量 # 如果你的站点有zh-CN、zh-TW这类带地区的语言标识,把下面正则里的([a-z]{2})改成([a-z]{2}(-[A-Za-z]{2,})?) RewriteCond %{REQUEST_URI} ^/([a-z]{2})/ [NC] RewriteRule ^ - [E=REQUEST_LANG:%1] # 提取到合法语言标识、且对应404文件存在时,直接返回对应语言的404页 RewriteCond %{ENV:REQUEST_LANG} !^$ RewriteCond %{DOCUMENT_ROOT}/404/%{ENV:REQUEST_LANG}.html -f RewriteRule ^ /404/%{ENV:REQUEST_LANG}.html? [L,NC,R=404] # 兜底规则:根路径请求、语言标识非法的请求,统一返回默认语言404(这里默认用英文,可自行修改路径) ErrorDocument 404 /404/en.html
使用这个方案需要提前开启Apache的mod_rewrite模块,同时站点虚拟主机配置里要设置AllowOverride All,否则.htaccess规则不会生效。
方案2:ErrorDocument配合轻量路由脚本(兼容性最好,无重写循环问题)
如果你的服务器环境rewrite规则容易出现循环、或者404页面路径规则比较复杂,用这个方案最稳妥:
- 先把原来的
ErrorDocument 404 /404/替换成下面的配置,把所有404请求统一交给路由文件处理:ErrorDocument 404 /404-router.php - 在站点根目录新建
404-router.php文件,复制下面的代码,根据自己的实际页面路径、支持的语言列表调整参数即可:<?php // 配置项:改成你站点实际支持的语言、默认语言、404页面存放路径 $allowed_langs = ['en', 'zh', 'ja', 'ko']; $default_lang = 'en'; $error_page_path = __DIR__ . '/404/'; // 从触发404的原请求地址里提取语言段 $request_path = parse_url($_SERVER['REDIRECT_URL'], PHP_URL_PATH); $path_segs = array_filter(explode('/', trim($request_path, '/'))); $current_lang = $path_segs[0] ?? $default_lang; // 语言不合法就回退到默认 if (!in_array($current_lang, $allowed_langs)) { $current_lang = $default_lang; } // 返回404状态码,加载对应语言的页面 http_response_code(404); require $error_page_path . "{$current_lang}.html"; exit;
配置注意点
- 一定要留默认语言的404页做兜底,避免URL不带语言段、或者语言标识输错时出现二次404
- 配置完记得测试:分别访问不同语言路径下的不存在地址,确认返回的是对应语言的404内容,同时HTTP状态码是404,切记不要返回200状态码,否则会严重影响站点SEO
- 如果你的语言标识不是放在URL第一段,只要修改对应提取规则的正则/代码逻辑即可
内容的提问来源于stack exchange,提问作者Adam Krawczyk
相关产品推荐
相关产品推荐

