Nginx redirect loop when force SSL











up vote
0
down vote

favorite












This has been asked before but none of the accepted answers I've found worked for me.

I'm using this general rule to route all http-traffic to https:



# Redirect http
# ==========================================================================
server {

listen 80 default_server;
listen [::]:80 default_server;

server_name www.example.com example.com;

return 301 https://www.example.com$request_uri;
}

# Redirect non-www / https
# ==========================================================================
server {

# ports
listen 443 ssl http2;
listen [::]:443 ssl http2;

# domain name
server_name example.com;

# ssl certificate files
ssl_certificate /etc/ssl/certs/*****.crt;
ssl_certificate_key /etc/ssl/private/*****.key;

# Redirect all non-https requests
return 301 https://www.example.com$request_uri;
}


# Primary Server
# ==========================================================================
server {


# ports
listen 443 ssl http2 default_server;
listen [::]:443 ssl http2 default_server;

# domain name
server_name www.example.com;

# ssl certificate files
ssl_certificate /etc/ssl/certs/*****.crt;
ssl_certificate_key /etc/ssl/private/*****.key;

include basic.conf;
}


But it does not work. Every request on port 80 redirects to itself and gives error




"too many redirects"




I really don't know what to do...



Nginx is running inside a docker container on a swarm-cluster.



UPDATE: Using the edited configuration above results in a working 301 for http://example.com but runs in a redirect loop again for http://www.example.com. Using curl i can see that the http-www-Version always redirects directly back to itself...but with added trailing slash...



This is the curl-output:



Ignoring the response-body
* Connection #0 to host www.example.com left intact
* Issue another request to this URL: 'http://www.example.com/'
* Found bundle for host www.example.com: 0x2cf2468 [can pipeline]
* Re-using existing connection! (#0) with host www.example.com
* Connected to www.example.com (**.***.***.***) port 80 (#0)
> GET / HTTP/1.1
> Host: www.example.com
> User-Agent: curl/7.54.0
> Accept: */*
>
< HTTP/1.1 301 Moved Permanently
< Server: nginx
< Date: Mon, 19 Nov 2018 12:22:25 GMT
< Content-Type: text/html
< Content-Length: 162
< Connection: keep-alive
< Location: http://www.example.com/
<
* Ignoring the response-body
* Connection #0 to host www.example.com left intact
* Maximum (50) redirects followed

curl: (47) Maximum (50) redirects followed


UPDATE #2: I've tried several things but it's still not working. Oddly enough if i change the first server-block to



server {

listen 80 default_server;
listen [::]:80 default_server;

server_name www.example.com example.com;

# test 1
return 302 https://www.another-example.com;

# test 2
return 302 https://www.example.com;
}


then for #test 1 it's working as expected and redirects to HTTPS://www.another-example.com. And using #test 2 gives me 302 HTTP://www.example.com ...like it's ignoring the HTTPS for this specific domain...???










share|improve this question
























  • Could you post your the result of curl -Lv yourdomain.com? I tried a similar server block configuration and it worked just fine.
    – Orphamiel
    Nov 19 at 11:38












  • Ok, i have added the curl-output to my post...domain and ip has been replaced...
    – Lars Dittrich
    Nov 19 at 12:26










  • I couldn't find out what was wrong but I'd try messing around with the server names a bit considering that's how Nginx prioritizes server blocks. digitalocean.com/community/tutorials/…
    – Orphamiel
    Nov 21 at 17:30












  • I don't think it's about the order of the server-blocks...please have a look at my Update #2...that would not be an explanation for this behaviour...
    – Lars Dittrich
    Nov 22 at 14:05















up vote
0
down vote

favorite












This has been asked before but none of the accepted answers I've found worked for me.

I'm using this general rule to route all http-traffic to https:



# Redirect http
# ==========================================================================
server {

listen 80 default_server;
listen [::]:80 default_server;

server_name www.example.com example.com;

return 301 https://www.example.com$request_uri;
}

# Redirect non-www / https
# ==========================================================================
server {

# ports
listen 443 ssl http2;
listen [::]:443 ssl http2;

# domain name
server_name example.com;

# ssl certificate files
ssl_certificate /etc/ssl/certs/*****.crt;
ssl_certificate_key /etc/ssl/private/*****.key;

# Redirect all non-https requests
return 301 https://www.example.com$request_uri;
}


# Primary Server
# ==========================================================================
server {


# ports
listen 443 ssl http2 default_server;
listen [::]:443 ssl http2 default_server;

# domain name
server_name www.example.com;

# ssl certificate files
ssl_certificate /etc/ssl/certs/*****.crt;
ssl_certificate_key /etc/ssl/private/*****.key;

include basic.conf;
}


But it does not work. Every request on port 80 redirects to itself and gives error




"too many redirects"




I really don't know what to do...



Nginx is running inside a docker container on a swarm-cluster.



UPDATE: Using the edited configuration above results in a working 301 for http://example.com but runs in a redirect loop again for http://www.example.com. Using curl i can see that the http-www-Version always redirects directly back to itself...but with added trailing slash...



This is the curl-output:



Ignoring the response-body
* Connection #0 to host www.example.com left intact
* Issue another request to this URL: 'http://www.example.com/'
* Found bundle for host www.example.com: 0x2cf2468 [can pipeline]
* Re-using existing connection! (#0) with host www.example.com
* Connected to www.example.com (**.***.***.***) port 80 (#0)
> GET / HTTP/1.1
> Host: www.example.com
> User-Agent: curl/7.54.0
> Accept: */*
>
< HTTP/1.1 301 Moved Permanently
< Server: nginx
< Date: Mon, 19 Nov 2018 12:22:25 GMT
< Content-Type: text/html
< Content-Length: 162
< Connection: keep-alive
< Location: http://www.example.com/
<
* Ignoring the response-body
* Connection #0 to host www.example.com left intact
* Maximum (50) redirects followed

curl: (47) Maximum (50) redirects followed


UPDATE #2: I've tried several things but it's still not working. Oddly enough if i change the first server-block to



server {

listen 80 default_server;
listen [::]:80 default_server;

server_name www.example.com example.com;

# test 1
return 302 https://www.another-example.com;

# test 2
return 302 https://www.example.com;
}


then for #test 1 it's working as expected and redirects to HTTPS://www.another-example.com. And using #test 2 gives me 302 HTTP://www.example.com ...like it's ignoring the HTTPS for this specific domain...???










share|improve this question
























  • Could you post your the result of curl -Lv yourdomain.com? I tried a similar server block configuration and it worked just fine.
    – Orphamiel
    Nov 19 at 11:38












  • Ok, i have added the curl-output to my post...domain and ip has been replaced...
    – Lars Dittrich
    Nov 19 at 12:26










  • I couldn't find out what was wrong but I'd try messing around with the server names a bit considering that's how Nginx prioritizes server blocks. digitalocean.com/community/tutorials/…
    – Orphamiel
    Nov 21 at 17:30












  • I don't think it's about the order of the server-blocks...please have a look at my Update #2...that would not be an explanation for this behaviour...
    – Lars Dittrich
    Nov 22 at 14:05













up vote
0
down vote

favorite









up vote
0
down vote

favorite











This has been asked before but none of the accepted answers I've found worked for me.

I'm using this general rule to route all http-traffic to https:



# Redirect http
# ==========================================================================
server {

listen 80 default_server;
listen [::]:80 default_server;

server_name www.example.com example.com;

return 301 https://www.example.com$request_uri;
}

# Redirect non-www / https
# ==========================================================================
server {

# ports
listen 443 ssl http2;
listen [::]:443 ssl http2;

# domain name
server_name example.com;

# ssl certificate files
ssl_certificate /etc/ssl/certs/*****.crt;
ssl_certificate_key /etc/ssl/private/*****.key;

# Redirect all non-https requests
return 301 https://www.example.com$request_uri;
}


# Primary Server
# ==========================================================================
server {


# ports
listen 443 ssl http2 default_server;
listen [::]:443 ssl http2 default_server;

# domain name
server_name www.example.com;

# ssl certificate files
ssl_certificate /etc/ssl/certs/*****.crt;
ssl_certificate_key /etc/ssl/private/*****.key;

include basic.conf;
}


But it does not work. Every request on port 80 redirects to itself and gives error




"too many redirects"




I really don't know what to do...



Nginx is running inside a docker container on a swarm-cluster.



UPDATE: Using the edited configuration above results in a working 301 for http://example.com but runs in a redirect loop again for http://www.example.com. Using curl i can see that the http-www-Version always redirects directly back to itself...but with added trailing slash...



This is the curl-output:



Ignoring the response-body
* Connection #0 to host www.example.com left intact
* Issue another request to this URL: 'http://www.example.com/'
* Found bundle for host www.example.com: 0x2cf2468 [can pipeline]
* Re-using existing connection! (#0) with host www.example.com
* Connected to www.example.com (**.***.***.***) port 80 (#0)
> GET / HTTP/1.1
> Host: www.example.com
> User-Agent: curl/7.54.0
> Accept: */*
>
< HTTP/1.1 301 Moved Permanently
< Server: nginx
< Date: Mon, 19 Nov 2018 12:22:25 GMT
< Content-Type: text/html
< Content-Length: 162
< Connection: keep-alive
< Location: http://www.example.com/
<
* Ignoring the response-body
* Connection #0 to host www.example.com left intact
* Maximum (50) redirects followed

curl: (47) Maximum (50) redirects followed


UPDATE #2: I've tried several things but it's still not working. Oddly enough if i change the first server-block to



server {

listen 80 default_server;
listen [::]:80 default_server;

server_name www.example.com example.com;

# test 1
return 302 https://www.another-example.com;

# test 2
return 302 https://www.example.com;
}


then for #test 1 it's working as expected and redirects to HTTPS://www.another-example.com. And using #test 2 gives me 302 HTTP://www.example.com ...like it's ignoring the HTTPS for this specific domain...???










share|improve this question















This has been asked before but none of the accepted answers I've found worked for me.

I'm using this general rule to route all http-traffic to https:



# Redirect http
# ==========================================================================
server {

listen 80 default_server;
listen [::]:80 default_server;

server_name www.example.com example.com;

return 301 https://www.example.com$request_uri;
}

# Redirect non-www / https
# ==========================================================================
server {

# ports
listen 443 ssl http2;
listen [::]:443 ssl http2;

# domain name
server_name example.com;

# ssl certificate files
ssl_certificate /etc/ssl/certs/*****.crt;
ssl_certificate_key /etc/ssl/private/*****.key;

# Redirect all non-https requests
return 301 https://www.example.com$request_uri;
}


# Primary Server
# ==========================================================================
server {


# ports
listen 443 ssl http2 default_server;
listen [::]:443 ssl http2 default_server;

# domain name
server_name www.example.com;

# ssl certificate files
ssl_certificate /etc/ssl/certs/*****.crt;
ssl_certificate_key /etc/ssl/private/*****.key;

include basic.conf;
}


But it does not work. Every request on port 80 redirects to itself and gives error




"too many redirects"




I really don't know what to do...



Nginx is running inside a docker container on a swarm-cluster.



UPDATE: Using the edited configuration above results in a working 301 for http://example.com but runs in a redirect loop again for http://www.example.com. Using curl i can see that the http-www-Version always redirects directly back to itself...but with added trailing slash...



This is the curl-output:



Ignoring the response-body
* Connection #0 to host www.example.com left intact
* Issue another request to this URL: 'http://www.example.com/'
* Found bundle for host www.example.com: 0x2cf2468 [can pipeline]
* Re-using existing connection! (#0) with host www.example.com
* Connected to www.example.com (**.***.***.***) port 80 (#0)
> GET / HTTP/1.1
> Host: www.example.com
> User-Agent: curl/7.54.0
> Accept: */*
>
< HTTP/1.1 301 Moved Permanently
< Server: nginx
< Date: Mon, 19 Nov 2018 12:22:25 GMT
< Content-Type: text/html
< Content-Length: 162
< Connection: keep-alive
< Location: http://www.example.com/
<
* Ignoring the response-body
* Connection #0 to host www.example.com left intact
* Maximum (50) redirects followed

curl: (47) Maximum (50) redirects followed


UPDATE #2: I've tried several things but it's still not working. Oddly enough if i change the first server-block to



server {

listen 80 default_server;
listen [::]:80 default_server;

server_name www.example.com example.com;

# test 1
return 302 https://www.another-example.com;

# test 2
return 302 https://www.example.com;
}


then for #test 1 it's working as expected and redirects to HTTPS://www.another-example.com. And using #test 2 gives me 302 HTTP://www.example.com ...like it's ignoring the HTTPS for this specific domain...???







nginx






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Nov 22 at 14:02

























asked Nov 16 at 11:46









Lars Dittrich

11




11












  • Could you post your the result of curl -Lv yourdomain.com? I tried a similar server block configuration and it worked just fine.
    – Orphamiel
    Nov 19 at 11:38












  • Ok, i have added the curl-output to my post...domain and ip has been replaced...
    – Lars Dittrich
    Nov 19 at 12:26










  • I couldn't find out what was wrong but I'd try messing around with the server names a bit considering that's how Nginx prioritizes server blocks. digitalocean.com/community/tutorials/…
    – Orphamiel
    Nov 21 at 17:30












  • I don't think it's about the order of the server-blocks...please have a look at my Update #2...that would not be an explanation for this behaviour...
    – Lars Dittrich
    Nov 22 at 14:05


















  • Could you post your the result of curl -Lv yourdomain.com? I tried a similar server block configuration and it worked just fine.
    – Orphamiel
    Nov 19 at 11:38












  • Ok, i have added the curl-output to my post...domain and ip has been replaced...
    – Lars Dittrich
    Nov 19 at 12:26










  • I couldn't find out what was wrong but I'd try messing around with the server names a bit considering that's how Nginx prioritizes server blocks. digitalocean.com/community/tutorials/…
    – Orphamiel
    Nov 21 at 17:30












  • I don't think it's about the order of the server-blocks...please have a look at my Update #2...that would not be an explanation for this behaviour...
    – Lars Dittrich
    Nov 22 at 14:05
















Could you post your the result of curl -Lv yourdomain.com? I tried a similar server block configuration and it worked just fine.
– Orphamiel
Nov 19 at 11:38






Could you post your the result of curl -Lv yourdomain.com? I tried a similar server block configuration and it worked just fine.
– Orphamiel
Nov 19 at 11:38














Ok, i have added the curl-output to my post...domain and ip has been replaced...
– Lars Dittrich
Nov 19 at 12:26




Ok, i have added the curl-output to my post...domain and ip has been replaced...
– Lars Dittrich
Nov 19 at 12:26












I couldn't find out what was wrong but I'd try messing around with the server names a bit considering that's how Nginx prioritizes server blocks. digitalocean.com/community/tutorials/…
– Orphamiel
Nov 21 at 17:30






I couldn't find out what was wrong but I'd try messing around with the server names a bit considering that's how Nginx prioritizes server blocks. digitalocean.com/community/tutorials/…
– Orphamiel
Nov 21 at 17:30














I don't think it's about the order of the server-blocks...please have a look at my Update #2...that would not be an explanation for this behaviour...
– Lars Dittrich
Nov 22 at 14:05




I don't think it's about the order of the server-blocks...please have a look at my Update #2...that would not be an explanation for this behaviour...
– Lars Dittrich
Nov 22 at 14:05

















active

oldest

votes











Your Answer






StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");

StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);

StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});

function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});


}
});














draft saved

draft discarded


















StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53337255%2fnginx-redirect-loop-when-force-ssl%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown






























active

oldest

votes













active

oldest

votes









active

oldest

votes






active

oldest

votes
















draft saved

draft discarded




















































Thanks for contributing an answer to Stack Overflow!


  • Please be sure to answer the question. Provide details and share your research!

But avoid



  • Asking for help, clarification, or responding to other answers.

  • Making statements based on opinion; back them up with references or personal experience.


To learn more, see our tips on writing great answers.





Some of your past answers have not been well-received, and you're in danger of being blocked from answering.


Please pay close attention to the following guidance:


  • Please be sure to answer the question. Provide details and share your research!

But avoid



  • Asking for help, clarification, or responding to other answers.

  • Making statements based on opinion; back them up with references or personal experience.


To learn more, see our tips on writing great answers.




draft saved


draft discarded














StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53337255%2fnginx-redirect-loop-when-force-ssl%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown





















































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown

































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown







Popular posts from this blog

What visual should I use to simply compare current year value vs last year in Power BI desktop

How to ignore python UserWarning in pytest?

Alexandru Averescu