Reputation: 4364
Im having problems redirecting my non-www urls to www and https.
What I want:
http://domain.com
http://www.domain.com
https://domain.com
should redirect to https://www.domain.com
.
http://api.domain.com
should redirect to https://api.domain.com
I have seperata ssl keys for domain.com and api.domain.com. SSL settings for api.domain.com is handled via the node.js app. Furthermore domain.com uses a root document and api.domain.com is using proxy_pass to a node.js application on port 1336.
What I tried:
# route non ssl api to ssl
server {
listen 80;
server_name api.domain.com;
return 301 https://api.domain.com;
}
# main ssl route for api.domain.com
server {
listen 443 ssl;
server_name api.domain.com;
location / {
proxy_pass https://localhost:1337;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}
# route non ssl to www ssl
server {
listen 80;
server_name www.domain.com domain.com;
return 301 https://www.domain.com;
}
# route non www ssl to ssl
server {
listen 443 ssl;
server_name domain.com;
return 301 https://www.domain.com;
}
# main ssl route for domain.com
server {
listen 443 ssl;
ssl on;
ssl_certificate /etc/letsencrypt/live/domain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/domain.com/privkey.pem;
server_name www.domain.com;
location / {
root /var/www/domain.com/www;
}
}
Routes which are working as expected: https://www.domain.com http://domain.com http://www.domain.com
Not working:
https://domain.com -> not secure connection, because it's trying to use the cert from api.domain.com (could this be cached, because maybe I tried it before another way, which was wrong)
https://api.domain.com-> redirects to https://domain.com
http://api.domain.com -> redirects to https://domain.com
nginx version: nginx/1.4.6 (Ubuntu)
Upvotes: 1
Views: 1042
Reputation: 4364
I could get it working know. One problem was, that nginx route for
listen 443;
server_name www.domain.com;
was also triggering for https://domain.com. Also disabling the cache in the Chrome Dev Console for testing was a huge help.
Full config:
# main ssl route for www.domain.com
server {
listen 443;
server_name www.domain.com;
ssl on;
ssl_certificate /etc/letsencrypt/live/domain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/domain.com/privkey.pem;
root /var/www/domain.com/www;
}
# non-www ssl route
server {
listen 443;
server_name domain.com;
return 301 https://www.domain.com$request_uri;
}
# route non ssl to www ssl
server {
listen 80;
server_name www.domain.com domain.com;
return 301 https://www.domain.com$request_uri;
}
# route non ssl api to ssl
server {
listen 80;
server_name api.domain.com;
return 301 https://api.domain.com$request_uri;
}
# main ssl route for api.domain.com
server {
listen 443 ssl;
ssl on;
ssl_certificate /etc/letsencrypt/live/api.domain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/api.domain.com/privkey.pem;
server_name api.domain.com;
location / {
proxy_pass http://localhost:1337;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}
Upvotes: 5