The Description:
I set up Magento with store config like this:
- Company Name - Webside
- Main Store - Store
- en - Store View
- dk - Store View
- Main Store - Store
My links looked like: https://my-company.com/shop/
Then I reaslised that this was wrong config for my needs and I had to change
- English - Webside
- Main Store - Store
- en - Store View
- Main Store - Store
- Danish - Webside
- Main Store - Store
- dk - Store View
- Main Store - Store
Plus, I enabled Magento feature "Add Store Code to Urls" which was previously disabled.
Now my links look like: https://my-company.com/en/shop/
Problem:
Since I already made sitemap while the changes were not made and submitted it to WebMasters, now I am facing the problem that all of the old links without store code in url does not work anymore (404 code - not found).
Because of WebMasters and other reasons I would really like to achieve this Result:
When somebody tries to open one of the old urls which is without store code (e.g. https://my-company.com/shop/), I would like he is redirected to the new url by just adding the store code as the first segment in url.
I already tried to achieve this by adding some rewrite rules to my nginx config but I ran into the infinite loop and at the end I could not find out the right solution for rewrite rules. (link to my question of nginx rewrite rules: Nginx Config Location Regex With Language Code In Url)
Full Nginx Config:
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;
}
}
this code i added for my nginx config, maybe will be helpfull for other, it is fix Admin area too:
Your web site fields three kinds of URL: There are the pretty permalinks which are not real files (e.g.
/en/shop/
) which get internally rewritten and handled by a controller (i.e./index.php
). There is the static content which are real files (CSS files, images, javascript) and are served directly bynginx
. And there is the obsolete sitemap (which you want to redirect to something else).The problem is that the rewrite rule you added also matches the static content.
So, you need to serve the static content first, before testing for the redirect. This is achieved by letting
try_files
see the original URI and then applying your new rewrite rule, inside the@handler
block:This seems to work in my test environment, but YMMV