You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

多语言URL缺少尾部斜杠时重定向丢失语言路径的问题求助

解决Apache多语言URL无尾部斜杠时丢失语言路径的问题

你猜的没错,问题根源确实是Apache默认开启的DirectorySlashes On设置!当请求的是一个实际存在的目录但URL不带尾部斜杠时,Apache会自动触发301重定向到带斜杠的版本,但你的现有RewriteRule已经先把语言前缀(es/fr/us)去掉了,所以重定向后的URL自然就丢了语言部分。

给你一套靠谱的解决方案,调整Rewrite规则的顺序,先处理带语言前缀的无斜杠重定向,再做内部路由:

具体规则配置

把下面的规则放在你现有RewriteRule的前面

# 先处理带语言前缀的目录请求(无尾部斜杠),重定向到带斜杠的版本
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^(es|fr|us)/(.+[^/])$ /$1/$2/ [R=301,L]

# 你的原有内部路由规则保持不变
RewriteRule ^(es|fr|us)/(.*)$ /$2 [QSA,L]

规则解释

  • 第一条规则的RewriteCond %{REQUEST_FILENAME} -d用来判断请求的目标是实际存在的目录(避免对普通文件也强制加斜杠)
  • ^(es|fr|us)/(.+[^/])$精准匹配带语言前缀但末尾无斜杠的URL,比如es/signup
  • [R=301,L]会触发301永久重定向到es/signup/,这一步语言前缀被完整保留在浏览器地址栏
  • 重定向完成后,你的原有规则再处理带斜杠的URL,内部路由到/signup/,同时浏览器地址栏始终显示带语言前缀的完整路径

不推荐的方案:关闭DirectorySlashes

虽然把DirectorySlashes Off可以禁用Apache自动加斜杠的重定向,但这可能带来连锁问题:比如用户访问目录时无法自动显示目录列表(如果站点允许的话),或者页面内的相对资源路径(如CSS/JS引用)出错,所以不建议这么做。

测试一下,现在访问www.example.com/es/signup应该会正确重定向到www.example.com/es/signup/,语言路径完全保留,同时内部路由正常工作。

内容的提问来源于stack exchange,提问作者mmakes

火山引擎 最新活动