Nginx重定向到https问题

时间:2015-04-01 18:39:04

标签: nginx

我一直在苦苦寻找解决我遇到的问题的方法: 我需要将所有http请求重定向到https,除了特定位置下的特定页面。 我有以下内容:

server {
        listen       80;
        listen       443 ssl;
        server_name  myserver;
        root         /var/www/example.org/htdocs;
        index        index.html;
        .
        .
}

我无法使用:

server {
       listen         80;
       server_name    my.domain.com;
       return         301 https://$server_name$request_uri;
}
server {
           listen         443 ssl;
           server_name    my.domain.com;
           .
           .
    }

我在here

中找到了一个很好的解决方案

解决方案的问题在于重定向进入了一个不定式循环,解决方案就像我的更改之后的那样:

map $uri $example_org_preferred_proto {
    default "https";
    ~^/post/ "http";
}
server {
    listen 80;
    listen 443 ssl;
    server_name example.org;
    root /var/www/example.org/htdocs;

    if ($example_org_preferred_proto = "https") {
        return 301 $example_org_preferred_proto://example.org$request_uri;
    }
}

我理解问题的逻辑:

  1. 我收到的请求如下:http://wwww.example.com/test - >重定向到https://wwww.example.com/test

  2. 现在我收到了一个请求:https://wwww.example.com/test - >重定向到https://wwww.example.com/test

  3. 现在我收到了一个请求:https://wwww.example.com/test - >重定向到https://wwww.example.com/test并进入循环....

  4. 我需要一种方法在重定向一次后停止。

1 个答案:

答案 0 :(得分:1)

server {
    listen       80;
    server_name  wwww.example.com;
    root         /var/www/example.org/htdocs;
    location /test {
        try_files $uri $uri/ =404;
    }
    location / {
        return         301 https://$server_name$request_uri;
    }
}

server {
    listen       443 ssl;
    ## here goes other ssl staff which you can find by link:
    ## https://gist.github.com/paskal/628882bee1948ef126dd
    server_name example.org;
    root /var/www/example.org/htdocs;
    location /test {
        try_files $uri $uri/ =404;
    }
    location / {
        return         301 https://$server_name$request_uri;
    }
}

最佳解决方案是最简单的解决方案。您只需要提供一个位置并重定向其他任何内容 - 这样做。 如果您在使用两个服务器块时遇到问题,请详细说明。