Nginx重定向HTTPS到HTTP

36

如何从https重定向到http?

我有下面的代码,但似乎并没有起作用。

server {
        listen 443;
        server_name example.com;
        rewrite ^(.*) http://example.com$1 permanent;
 }

2
请问您是否能接受这个答案? - brupm
2
没有SSL证书是无法连接HTTPS的。您需要一个带有SSL证书配置和重定向到其他非SSL 80服务器块的服务器块。如果没有证书,443端口上监听的服务器实际上是http://domain:443而不是https://domain/ - Unicornist
4个回答

28

上面的答案是可行的,您需要生成自签名证书(或使用真实证书),并将nginx配置为如下:

server {
  listen *:443;
  ssl on;
  server_name domain.com;
  rewrite ^(.*) http://domain.com$1 permanent;

  ssl_certificate      /data/certs/domain.crt;
  ssl_certificate_key  /data/certs/domain.key; 
 }

请注意,如果证书是自签名的,浏览器会给出一个不友好的警告。


2
有没有可能在不购买我们不需要的证书的情况下,实现这个重定向而不出现丑陋的警告?谢谢! - dgilperez
你可以从StartSSL获取免费的SSL证书,这样就可以摆脱警告了。自签名证书始终会引发你所说的警告。 - Thomas Ward
5
如果您指定了多个服务器名称,也可以使用“ rewrite ^(.) http://$host$1 permanent;”替换“rewrite ^(.) http://domain.com$1 permanent;”。请注意,这不改变原始意思。 - SameOldNick
5
“listen *:443”, “listen 443” 和 “listen 443 ssl” 之间有什么区别? - Michael
1
你也可以从Let's Encrypt获得免费证书。我知道我来晚了... - whoan

16

基于jberger的评论,一个可行的配置应该是:

server {
    listen *:80;
    server_name example.com;
}

server {
    listen              *:443 ssl;
    server_name         example.com;
    ssl_certificate     /etc/ssl/certs/example.com.cert;
    ssl_certificate_key /etc/ssl/private/example.com.key;
    return 301 http://$server_name$request_uri;
}

1
最好的是,除非问题要求使用https -> http。将“https”更改为“http”,并将生成的“return 301 http://$server_name$request_uri;”移动到443服务器块中。 - here
谢谢@各位。已更新。 - krd

1
    if ($host = 'foo.com') {
        rewrite  ^/(.*)$  http://www.foo.com$1  permanent;
    }

7
这段代码可能需要重构为两个独立的server块,一个用于捕获http请求,另一个用于捕获https请求并执行return 301 http://$server_name$request_uri;。请注意避免使用nginx的PitfallsIfIsEvil - Jake Berger

-5
你需要创建两个独立的服务器块:
  1. 端口443(HTTPS)- 在此块中定义所有内容,如PHP、404、home、root等。即使您想将 https://www.example.com 重定向到https://example.com 或反过来,也要像@coulix一样在此处完成。

  2. 端口80(HTTP)- 在此处仅使用:

server {
    listen    80;
    listen    [::]:80;
    server_name    example.com www.example.com;

    # Redirect HTTP to HTTPS
    return    301    https://example.com$request_uri;
}

1
OP正在询问如何将HTTPS重定向到HTTP,而不是相反地重定向。 - Unicornist

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接