Magento从旧Url重定向到具有存储(语言)代码的新Url


Magento Redirect From Old Urls To New Urls Which Has Store (Language) Code

描述:
我设置Magento的商店配置如下:

  • 公司名称-Webside
    • 主商店-商店
      • en-商店视图
      • dk-商店视图

我的链接看起来像:https://my-company.com/shop/

然后我推断这是符合我需求的错误配置,我不得不更改

  • 英语-Webside
    • 主商店-商店
      • en-商店视图
  • 丹麦语-Webside
    • 主商店-商店
      • dk-商店视图


加上,我启用了Magento功能"将存储代码添加到URL",该功能以前已禁用。
现在我的链接如下:https://my-company.com/en/shop/



问题:
由于我已经制作了网站地图,而没有进行更改并将其提交给了WebMasters,现在我面临的问题是,所有在url中没有存储代码的旧链接都不能工作了(404代码-找不到)。



由于网站管理员和其他原因,我真的很想实现这一目标结果:
当有人试图打开一个没有存储代码的旧URL时(例如。https://my-company.com/shop/),我希望他只需添加商店代码作为url中的第一段,就可以重定向到新的url。



我已经尝试通过在nginx配置中添加一些重写规则来实现这一点,但我遇到了无限循环,最后我找不到重写规则的正确解决方案。(链接到我关于nginx重写规则的问题:nginx Config Location Regex With Language Code In Url)

完整Nginx配置:

server {
    # Listen on port 8080 as well as post 443 for SSL connections.
    listen              8080;
    listen              443 default ssl;
server_name         example.com www.example.com;
large_client_header_buffers 4 16k;
ssl             on;
# Specify path to your SSL certificates.
ssl_certificate         /path/top/certificate.crt;
ssl_certificate_key     /path/to/key.key;
ssl_protocols               TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers         "EECDH+AESGCM:EDH+AESGCM:ECDHE-RSA-AES128-GCM-SHA256:AES256+EECDH:DHE-RSA-AES128-GCM-SHA256:AES256+EDH:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4";
ssl_prefer_server_ciphers   on;
ssl_dhparam         /path/to/dh_params.pem;
    ssl_session_cache       shared:SSL:10m;
    ssl_session_timeout     10m;
    keepalive_timeout       70;
    add_header          Strict-Transport-Security max-age=15768000;
ssl_stapling            on;
ssl_stapling_verify     on;
resolver            8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout        5s;
ssl_trusted_certificate     /path/to/certificate.crt;
# Path to the files in which you wish to store your access and error logs.
access_log          /path/to/access_log;
error_log           /path/to/error_log;
root                /path/to/root/folder;
location ~* "^/(?![a-z]{2}/)(.+)$" {
    rewrite         / /en/$1 permanent;
}
location / {
    index           index.htm index.html index.php;
    try_files       $uri $uri/ @handler;
}
# Deny access to specific directories no one in particular needs access to anyways.
location /app/          { deny all; }
location /includes/     { deny all; }
location /lib/          { deny all; }
location /media/downloadable/   { deny all; }
location /pkginfo/      { deny all; }
location /report/config.xml { deny all; }
location /var/          { deny all; }
# Allow only those who have a login name and password to view the export folder. Refer to /etc/nginx/htpassword.
location /var/export/ {
    auth_basic      "Restricted";
    auth_basic_user_file    htpasswd;
    autoindex       on;
}
# Deny all attempts to access hidden files such as .htaccess, .htpasswd, etc...
location ~ /'. {
    deny            all;
    access_log      off;
    log_not_found       off;
}
# This redirect is added so to use Magentos common front handler when handling incoming URLs.
location @handler {
    rewrite         / /index.php?$query_string;
}
# Forward paths such as /js/index.php/x.js to their relevant handler.
location ~ .php/ {
    rewrite         ^(.*.php)/ $1 last;
}
# Handle the exectution of .php files.
location ~ .php$ {
    if (!-e $request_filename) {
        rewrite     / /index.php last;
    }
    expires         off;
    fastcgi_split_path_info ^(.+'.php)(/.+)$;
    fastcgi_pass        unix:/path/to/php-fpm.sock;
    fastcgi_index       index.php;
    fastcgi_param       HTTPS on;
    fastcgi_param       SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param       MAGE_RUN_CODE en;
    fastcgi_param       MAGE_RUN_TYPE store;
    include         fastcgi_params;
}
}

您的网站字段有三种URL:有一些漂亮的永久链接,它们不是真正的文件(例如/en/shop/),由控制器(即/index.php)在内部重写和处理。静态内容是真实的文件(CSS文件、图像、javascript),由nginx直接提供。还有一个过时的网站地图(你想把它重定向到其他地方)。

问题是,您添加的重写规则也与静态内容相匹配。

因此,在测试重定向之前,您需要首先提供静态内容。这是通过让try_files看到原始URI,然后在@handler块内应用新的重写规则来实现的:

location @handler {
  rewrite "^/(?![a-z]{2}/)(.+)$" /en/$1 permanent;
  rewrite / /index.php?$query_string;
}

这似乎在我的测试环境中有效,但YMMV

我为nginx配置添加的这段代码,可能对其他人有帮助,它也修复了管理区域:

location / {
 rewrite "^/(?![a-z]{2}/)(.+)$" /en/$1 permanent;
  rewrite / /index.php?$query_string;
}
location /index.php/admin {
 try_files $uri $uri/ /index.php?$args;
 index index.php index.html index.htm;
}