title: Set custom 404 error page on nginx based on locale through url parameter
body: <p>i'm running latest stable version of <code>Nginx</code> on <code>GNU/Linux</code> OS and having the following virtual host, i'm trying to <code>setup custom localized 404 error pages avoiding if</code> but i always end up in redirect loops.</p>
  
  <p>By now, i'm only contemplating the following locales <code>es</code>, <code>en</code> and <code>ca</code> which i get as a URL parameter, always next to the domain. The <code>expected URLs are</code> something like:  </p>
  
  <pre><code>http://www.example.com/ca
  http://www.example.com/ca/home
  http://www.example.com/en
  http://www.example.com/en/contact
  </code></pre>
  
  <p>This is my nginx server block:  </p>
  
  <pre><code>server {
          listen          80;
          listen          [::]:80;
          server_name     example.com;
          root            /var/www/html/example_com;
          # By default, show Castilian index
          index           es/index.html;
  
          access_log      /var/log/nginx/example_com.access.log main;
          error_log       /var/log/nginx/example_com.error.log error;
  
          #Remove HTML Extension
          rewrite ^(/.*)\.html(\?.*)?$ $1$2 permanent;
  
          # Remove trailing slash
          rewrite ^/(.*)/$ /$1 permanent;
  
          # Make sure Nginx knows what files to look for, and for that we use the try_files directive.
          # Look for a file with the current $uri and an .html extension, and if no file exists, 
          # check for a directory with that name and serve the index. Otherwise, render a 404 error.
          try_files $uri/index.html $uri.html $uri/ $uri =404;
  
          location = /form/contact.php {
                  deny all;
                  return 404;
          }
  
          # Custom error pages
          set $error404 /en/404.html;
  
          location /ca {
              set $error404 /ca/404.html;
          }
  
          error_page 404 =404 $error404;
  
  
          location = /form/contact {
                  try_files $uri.php =404;
  
                  include /etc/nginx/fastcgi_params;
                  fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
                  send_timeout 1800;
                  fastcgi_read_timeout 1800;
                  fastcgi_pass unix:/var/run/php5-fpm.sock;
          }
  
          location ~ /\.ht {
              deny  all;
          }
  
          location ~ /(config) {
                  deny all;
                  return 404;
          }
      }
  </code></pre>