使用nginx重定向到SSL

时间:2013-08-30 00:45:41

标签: nginx

我在同一主机上有http://和https://,如下所示:

server {

    listen   80;
    listen   443 ssl;

    ...
    ...
}

我需要做的是将访问我店铺的用户重定向到https://。问题是我有很多语言:

https://mydomain.com/ EN /店铺 https://mydomain.com/ FR /店铺 等...

我尝试了这个并且它无效(nginx: configuration file /etc/nginx/nginx.conf test failed)

if ($server_port = 80) {
    location (en|fr)/shop {
        rewrite ^ https://$host$request_uri permanent;
    }
}

5 个答案:

答案 0 :(得分:47)

进行301重定向而不是使用if语句(参见http://wiki.nginx.org/Pitfalls上的服务器名称),这也是NGINX的最佳做法。我创建了一个带有为SSL,Rails和Unicorn配置的nginx.conf的要点

https://gist.github.com/Austio/6399964

以下是您的相关部分。

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

答案 1 :(得分:11)

或者更好的是,避免使用硬编码的服务器名称

server {
  listen 80;
  rewrite (.*) https://$http_host$1 permanent;
}

答案 2 :(得分:6)

为了使用正则表达式匹配location,您需要在表达式前加上~~*

if ($server_port = 80) {
    location ~ (en|fr)/shop {
        rewrite ^ https://$host$request_uri permanent;
    }
}

来自documentation

  

要使用正则表达式,必须使用前缀:

     
      
  1. "~"用于区分大小写的匹配
  2.   
  3. "~*"用于不区分大小写的匹配
  4.   

由于nginx不允许location块嵌套在if块内,因此请尝试以下配置:

if ($server_port = 80) {
    rewrite ^/(en|fr)/shop https://$host$request_uri permanent;
}

答案 3 :(得分:2)

理想情况下,在保留尾随路径时避免使用if语句:

server {
  listen 80;
  server_name example.com;
  rewrite (.*) https://example.com$1 permanent;
}

永久负责301。

答案 4 :(得分:2)

另一种方法是使用error_page 497

server {
    listen 80;
    listen 443;

    ssl on;
    error_page 497  https://$host$request_uri;
    ssl_certificate     /etc/ssl/certs/ssl-cert-snakeoil.pem;
    ssl_certificate_key /etc/ssl/private/ssl-cert-snakeoil.key;
...