You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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.

错误原因

  1. 重定向规则未添加[L,R=302]标记,导致请求未终止外部重定向,触发内部循环
  2. 规则顺序不合理,特殊路径/partner的重定向未优先处理,且未排除已带语言前缀的请求
  3. 未正确区分外部重定向与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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 02:54:51