3
votes

The Description:
I set up Magento with store config like this:

  • Company Name - Webside
    • Main Store - Store
      • en - Store View
      • dk - Store View

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
  • Danish - Webside
    • Main Store - Store
      • dk - Store View


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;
}

}
2
Can you show your rewrites that are producing the infinite loop? Your rewrites may be fine but the loop is caused by your browser e.g. Chrome's internal DNS chrome://net-internals/#dnsjdm2112
Updated question with code snippetArtis Virskuls
Presumably this is (or was) a working web site. You are posting a code snippet that clearly has a redirect loop. I think we need more of your nginx configuration to understand why the PHP handler is broken.Richard Smith
Richard, I updated the question by adding full nginx configurationArtis Virskuls

2 Answers

3
votes

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 by nginx. 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:

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

This seems to work in my test environment, but YMMV

0
votes

this code i added for my nginx config, maybe will be helpfull for other, it is fix Admin area too:

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;
}