Thursday, September 3, 2015

Avoid double redirect NGINX




I'm redirecting my website users to the HTTPS version of the site using a 301 redirect with Nginx.
I've tested my site using PageSpeed from Google and found that I was double redirecting from the main page. This is because of my CMS. Example:
http:// domain.tld -> NGINX 301 -> to https:// domain.tld -> CMS redirect -> https:// domain.tld/homepage

I was hoping that I could redirect the direct root link using NGINX with



location = / {
return 301 https:// domain.tld/homepage;
}


this works for the home page, however, this will give 404 errors to any other http page than the homepage, I tried adding return 301 https://$host$request_uri; under the location block, but somehow this overwrites the root domain rule. (which give a double redirect again) Is there any way to redirect all links with their appropriate request_uri, EXCEPT for the root domain?

P.S. I was hoping to do this without an if function: See: https://www.nginx.com/resources/wiki/start/topics/depth/ifisevil/




Here is a sample of my full config file:



server {
listen 80;
server_name domainname.tld;

location = / {
return 301 https://domainname.tld/homepage;
}


return 301 https://$host$request_uri;
#if i remove this I'll get 404 errors on any other page than the homepage.
#but if I add it, the 'location = /' block gets ignored.
}

server {

listen 443 ssl;


server_name domainname.tld;

root /var/www/domainname.tld;
index index.php;

... (stuff like rewrite rules, irrelevant) ...

}

Answer




Just wrap it in a location / { ... } block to give it equal precedence:



server {
listen 80;
server_name domainname.tld;

location = / {
return 301 https://$server_name/homepage;
}
location / {

return 301 https://$server_name$request_uri;
}
}


See this document for details.


No comments:

Post a Comment

linux - How to SSH to ec2 instance in VPC private subnet via NAT server

I have created a VPC in aws with a public subnet and a private subnet. The private subnet does not have direct access to external network. S...