Apache RewriteCond配置异常:静态文件加载失败与URL重定向错误
Apache2多语言站点配置修复方案
环境与需求
- 站点目录结构:
+ /var/www/website |- es # 西班牙语版本文件目录 |- en # 英语版本文件目录(默认语言) - 预期URL规则:
- 英语版本:
https://example.com/直接返回英语内容https://example.com/en/自动重定向到https://example.com/
- 西班牙语版本:
https://example.com/es/返回西班牙语内容
- 静态文件必须从对应语言目录加载(比如西班牙语下的静态文件需通过
https://example.com/es/image.png访问)
- 英语版本:
当前配置的问题
- 静态文件加载失败:访问
https://example.com/image.png时,服务器无法找到对应语言目录下的文件 - 英语版本重定向逻辑错误:当前配置会把根目录请求跳转到
/en/,和预期的/en/跳转到根目录相反
修复后的完整Apache2配置
<VirtualHost *:443> ServerName example.com DocumentRoot /var/www/website <Directory /var/www/website> Require all granted AllowOverride all RewriteEngine on RewriteBase / # 把/en/开头的请求重定向到根目录,保留后续路径 RewriteRule ^en/(.*)$ /$1 [R=301,L] # 根目录访问时的自动语言跳转 # 优先匹配西班牙语请求,跳转到/es/ RewriteCond %{HTTP:Accept-Language} ^es [NC] RewriteRule ^$ /es/ [R,L] # 非西语/英语请求,默认跳转到根目录(英语版本) RewriteCond %{HTTP:Accept-Language} !^en [NC] RewriteCond %{HTTP:Accept-Language} !^es [NC] RewriteRule ^$ / [R,L] # 内部重写,确保内容从对应语言目录读取 # 处理/es/路径下的请求,直接指向es目录 RewriteCond %{REQUEST_URI} ^/es/ RewriteRule ^es/(.*)$ es/$1 [L] # 根目录请求,内部指向en目录(默认英语) RewriteRule ^(.*)$ en/$1 [L] </Directory> </VirtualHost>
配置规则说明
- 重定向规则:强制
/en/开头的请求跳转到根目录,用301永久重定向保证搜索引擎收录规范 - 自动语言跳转:根据浏览器的
Accept-Language头部,优先给西语用户跳转到/es/,其他用户默认留在根目录 - 内部文件映射:用户访问根目录内容(比如
/image.png)时,服务器实际从en/image.png读取;访问/es/image.png时,从es/image.png读取,解决静态文件加载问题
内容的提问来源于stack exchange,提问作者Anuj TBE
相关产品推荐
相关产品推荐

