Shopware 6基于浏览器语言的路径保留重定向问题排查
解决Shopware 6基于浏览器语言的路径保留重定向循环问题
问题背景
在Shopware 6的标准.htaccess基础上,需要实现以下重定向需求:
- 根路径重定向:
example.com/→ 根据浏览器Accept-Language跳转到对应语言版本(如德语→example.com/de/) - 路径保留重定向:
example.com/contact→example.com/de/contact(匹配对应语言) - 特殊路径适配:
/partner重定向到/de/account/login?campaignCode=partner&affiliateCode=partner,且适配所有语言场景
之前尝试的配置触发了重定向循环错误:
AH00124: Request exceeded the limit of 10 internal redirects due to probable configuration error. Use 'LimitInternalRecursion' to increase the limit if necessary. Use 'LogLevel debug' to get a backtrace.
错误原因
- 重定向规则未添加
[L,R=302]标记,导致请求未终止外部重定向,触发内部循环 - 规则顺序不合理,特殊路径
/partner的重定向未优先处理,且未排除已带语言前缀的请求 - 未正确区分外部重定向与Shopware内部路由转发的边界
修正后的完整.htaccess配置
# Redirect to language version based on browsers preferred language, default = de # shop.example.de only RewriteEngine On # 优先处理/partner路径重定向,覆盖带语言前缀的场景 RewriteCond %{HTTP_HOST} example [NC] RewriteRule ^partner$ /de/account/login?campaignCode=partner&affiliateCode=partner [L,R=302] RewriteCond %{HTTP_HOST} example [NC] RewriteRule ^(de|en|es|fr)/partner$ /de/account/login?campaignCode=partner&affiliateCode=partner [L,R=302] # 德语匹配:无语言前缀的所有路径重定向 RewriteCond %{HTTP_HOST} example [NC] RewriteCond %{REQUEST_URI} !^/(de|en|es|fr)/ [NC] RewriteCond %{HTTP:Accept-Language} ^de [NC] RewriteRule ^(.*)$ /de/$1 [L,R=302] # 英语匹配:无语言前缀的所有路径重定向 RewriteCond %{HTTP_HOST} example [NC] RewriteCond %{REQUEST_URI} !^/(de|en|es|fr)/ [NC] RewriteCond %{HTTP:Accept-Language} ^en [NC] RewriteRule ^(.*)$ /en/$1 [L,R=302] # 西班牙语匹配:无语言前缀的所有路径重定向 RewriteCond %{HTTP_HOST} example [NC] RewriteCond %{REQUEST_URI} !^/(de|en|es|fr)/ [NC] RewriteCond %{HTTP:Accept-Language} ^es [NC] RewriteRule ^(.*)$ /es/$1 [L,R=302] # 法语匹配:无语言前缀的所有路径重定向 RewriteCond %{HTTP_HOST} example [NC] RewriteCond %{REQUEST_URI} !^/(de|en|es|fr)/ [NC] RewriteCond %{HTTP:Accept-Language} ^fr [NC] RewriteRule ^(.*)$ /fr/$1 [L,R=302] # 默认重定向到德语:无匹配语言时触发 RewriteCond %{HTTP_HOST} example [NC] RewriteCond %{REQUEST_URI} !^/(de|en|es|fr)/ [NC] RewriteRule ^(.*)$ /de/$1 [L,R=302] # BEGIN Shopware # The directives (lines) between "# BEGIN Shopware" and "# END Shopware" are dynamically generated. Any changes to the directives between these markers will be overwritten. DirectoryIndex index.php <IfModule mod_negotiation.c> Options -MultiViews </IfModule> <IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{REQUEST_URI}::$1 ^(/.+)/(.*)::\2$ RewriteRule ^(.*) - [E=BASE:%1] # Sets the HTTP_AUTHORIZATION header removed by Apache RewriteCond %{HTTP:Authorization} . RewriteRule ^ - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] RewriteCond %{ENV:REDIRECT_STATUS} ^$ RewriteRule ^index\.php(?:/(.*)|$) %{ENV:BASE}/$1 [R=301,L] # If the requested filename exists, simply serve it. # We only want to let Apache serve files and not directories. RewriteCond %{REQUEST_FILENAME} -f RewriteRule ^ - [L] # Rewrite all other queries to the front controller. RewriteRule ^ %{ENV:BASE}/index.php [L] </IfModule> <IfModule !mod_rewrite.c> <IfModule mod_alias.c> RedirectMatch 302 ^/$ /index.php/ </IfModule> </IfModule> <IfModule mod_headers.c> <FilesMatch "\.(?i:svg)$"> Header set Content-Security-Policy "script-src 'none'" </FilesMatch> </IfModule> # END Shopware
关键配置说明
- 规则顺序优先:将特殊路径
/partner的重定向放在最前面,避免被通用语言规则拦截 - 终止重定向标记:每个重定向规则添加
[L]终止后续规则执行,R=302明确外部重定向,阻断内部循环 - 排除已处理请求:通过
RewriteCond %{REQUEST_URI} !^/(de|en|es|fr)/确保已带语言前缀的请求不再触发重定向 - 全路径覆盖:使用
^(.*)$匹配根路径及所有子路径,实现路径完整保留的语言定向
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

