2017-09-25 88 views
0

我想重定向我的所有http流量重定向到https。我正在使用letsencrypt。我在線閱讀,return 301 https://$server_name$request_uri;會重定向到我的網站的所有流量到https,但結果在ERR_TOO_MANY_REDIRECTSERR_TOO_MANY_REDIRECTS與nginx

沒有上面提到的聲明,一切正常,但我必須在URL中專門指定https。這是我的/etc/nginx/sites-available/default文件:

server { 
     listen 80 default_server; 
     listen 443 ssl default_server; 

     ssl_certificate /etc/letsencrypt/live/mywebsite.me/fullchain.pem; 
     ssl_certificate_key /etc/letsencrypt/live/mywebsite.me/privkey.pem; 

     root /home/website/mywebsite/public; 

     index index.html index.htm index.php; 

     server_name mywebsite.me www.mywebsite.me; 

     return 301 https://$server_name$request_uri; 

     location/{ 
       try_files $uri $uri/ /index.php$is_args$args; 
     } 

     location ~ \.php$ { 
       include snippets/fastcgi-php.conf; 
       fastcgi_pass unix:/var/run/php/php7.1-fpm.sock; 
     } 
} 

我在哪裏出錯了?

回答

3

你的配置更改爲以下

server { 
     listen 80 default_server; 
     server_name mywebsite.me www.mywebsite.me; 

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

server { 

     listen 443 ssl default_server; 

     ssl_certificate /etc/letsencrypt/live/mywebsite.me/fullchain.pem; 
     ssl_certificate_key /etc/letsencrypt/live/mywebsite.me/privkey.pem; 

     root /home/website/mywebsite/public; 

     index index.html index.htm index.php; 

     server_name mywebsite.me www.mywebsite.me; 

     location/{ 
       try_files $uri $uri/ /index.php$is_args$args; 
     } 

     location ~ \.php$ { 
       include snippets/fastcgi-php.conf; 
       fastcgi_pass unix:/var/run/php/php7.1-fpm.sock; 
     } 
} 

您當前的配置對重定向HTTP和HTTPS到HTTPS。所以它由於return語句而成爲一個無限循環。只有在連接是http時才需要返回語句。所以你把它分成兩個服務器塊

0

與nginx代理相同的情況。我很困惑proxy_pass http://或https://

server { 
    listen 80; 
    listen [::]:80; 

    root /var/www/tomato.mysite.com/html; 
    index index.html index.htm index.nginx-debian.html; 

    server_name tomato.mysite.com; 

    location/{ 
     proxy_pass http://tomato.mysite.com:4000/; # meteor server at port 4000 
     proxy_http_version 1.1; 
     proxy_set_header Upgrade $http_upgrade; 
     proxy_set_header Connection "upgrade"; 
     proxy_set_header Host $http_host; 
     proxy_set_header X-Real-IP $remote_addr; 
     proxy_set_header X-Forward-For $proxy_add_x_forwarded_for; 
     proxy_set_header X-Forward-Proto http; 
     proxy_set_header X-Nginx-Proxy true; 
     proxy_redirect off; 
    } 

    listen 443 ssl; 
    ssl_certificate /etc/letsencrypt/live/mysite.com/fullchain.pem; 
    ssl_certificate_key /etc/letsencrypt/live/mysite.com/privkey.pem; 
    include /etc/letsencrypt/options-ssl-nginx.conf; 
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; 

    if ($scheme != "https") { 
     return 301 https://$host$request_uri; 
    } # managed by Certbot 
} 
+0

把http和https放在一個單獨的塊中,如第一個解決方案中所示。它爲我工作。 –

+0

@PritamBohra無法工作。正如你所看到的,我需要代理到另一個端口的同一個服務器名稱。當沒有ssl的後臺應用被強制時,我的配置工作正常。當'http:4000'工作時,'https:'工作正常,否則當'http:4000'本身重定向到'https:'時,配置無法工作。這是我在很多討論過程中見過的流星應用程序中流行的一個問題。也許我需要配置流星應用程序來使用ssl,而不僅僅是nginx。 – sitexa