基于浏览器语言的重定向,保留路径作为 Shopware 6 .htaccess 的补充

问题描述 投票:0回答:1

我们尝试在 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.,
apache redirect shopware6
1个回答
0
投票

我想我找到了解决方案:


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

© www.soinside.com 2019 - 2024. All rights reserved.