我们尝试在 Shopware 6 系统中建立基于浏览器语言(Accept-Language 标头)的重定向,作为标准 .htaccess 文件的补充。
我们成功地为根 URL 做到了这一点,即
example.com/ -> example.com/de/(如果浏览器语言是德语)
适用于以下 .htaccess 代码:
# Redirect to language version based on browsers preferred language, default = de
# shop.example.de only
RewriteEngine On
RewriteCond %{HTTP_HOST} example [NC]
RewriteRule ^partner /de/account/login?campaignCode=partner&affiliateCode=partner [L,R=302]
RewriteCond %{HTTP_HOST} example [NC]
RewriteCond %{HTTP:Accept-Language} ^de [NC]
RewriteRule ^$ /de%{REQUEST_URI} [L,R=302]
RewriteCond %{HTTP_HOST} example [NC]
RewriteCond %{HTTP:Accept-Language} ^en [NC]
RewriteRule ^$ /en%{REQUEST_URI} [L,R=302]
RewriteCond %{HTTP_HOST} example [NC]
RewriteCond %{HTTP:Accept-Language} ^es [NC]
RewriteRule ^$ /es%{REQUEST_URI} [L,R=302]
RewriteCond %{HTTP_HOST} example [NC]
RewriteCond %{HTTP:Accept-Language} ^fr [NC]
RewriteRule ^$ /fr%{REQUEST_URI} [L,R=302]
RewriteCond %{HTTP_HOST} example [NC]
RewriteRule ^$ /de%{REQUEST_URI} [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
不,我们想保持路径完好无损
example.com/contact -> example.com/de/contact
我们还希望 /partner 重定向适用于所有语言。
我们尝试过此操作,但遇到了重定向循环:
RewriteCond %{HTTP_HOST} example [NC]
RewriteRule ^partner /de/account/login?campaignCode=partner&affiliateCode=partner [L,R=302]
RewriteCond %{HTTP_HOST} example
RewriteCond %{REQUEST_URI} !^/(de|en|es|fr)/
RewriteCond %{HTTP:Accept-Language} ^de [NC]
RewriteRule ^(.*)$ /de/$1
RewriteCond %{HTTP_HOST} example
RewriteCond %{REQUEST_URI} !^/(de|en|es|fr)/
RewriteCond %{HTTP:Accept-Language} ^en [NC]
RewriteRule ^(.*)$ /en/$1
RewriteCond %{HTTP_HOST} example
RewriteCond %{REQUEST_URI} !^/(de|en|es|fr)/
RewriteCond %{HTTP:Accept-Language} ^es [NC]
RewriteRule ^(.*)$ /es/$1
RewriteCond %{HTTP_HOST} example
RewriteCond %{REQUEST_URI} !^/(de|en|es|fr)/
RewriteCond %{HTTP:Accept-Language} ^fr [NC]
RewriteRule ^(.*)$ /fr/$1
RewriteCond %{HTTP_HOST} example
RewriteCond %{REQUEST_URI} !^/(de|en|es|fr)/
RewriteRule ^(.*)$ /de/$1
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.,
我想我找到了解决方案:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^ - [L]
RewriteCond %{HTTP_HOST} example [NC]
RewriteRule ^(de|en|es|fr)/partner /$1/account/login?campaignCode=partner&affiliateCode=partner [L,R=302]
RewriteCond %{HTTP_HOST} example
RewriteCond %{REQUEST_URI} !index.php
RewriteCond %{REQUEST_URI} !^/(de|en|es|fr)/
RewriteCond %{HTTP:Accept-Language} ^de [NC]
RewriteRule ^(.*)$ /de/$1 [END,R=302]
RewriteCond %{HTTP_HOST} example
RewriteCond %{REQUEST_URI} !index.php
RewriteCond %{REQUEST_URI} !^/(de|en|es|fr)/
RewriteCond %{HTTP:Accept-Language} ^en [NC]
RewriteRule ^(.*)$ /en/$1 [END,R=302]
RewriteCond %{HTTP_HOST} example
RewriteCond %{REQUEST_URI} !index.php
RewriteCond %{REQUEST_URI} !^/(de|en|es|fr)/
RewriteCond %{HTTP:Accept-Language} ^es [NC]
RewriteRule ^(.*)$ /es/$1 [END,R=302]
RewriteCond %{HTTP_HOST} example
RewriteCond %{REQUEST_URI} !index.php
RewriteCond %{REQUEST_URI} !^/(de|en|es|fr)/
RewriteCond %{HTTP:Accept-Language} ^fr [NC]
RewriteRule ^(.*)$ /fr/$1 [END,R=302]
RewriteCond %{HTTP_HOST} example
RewriteCond %{REQUEST_URI} !index.php
RewriteCond %{REQUEST_URI} !^/(de|en|es|fr)/
RewriteRule ^(.*)$ /de/$1 [END,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.
...
所以我复制了部分 Shopware 标准规则,并从匹配中排除了
index.php