Nginx 阻止多个域将所有流量重定向到 https?

Nginx 阻止多个域将所有流量重定向到 https?

我有一个运行 nginx 1.6 的 Web 服务器,它有一个 IP 地址,托管 www.domainname.com 和 dev.domainname.com。

我正在尝试找到一种智能方法将所有 http 流量路由到 https,并且我想确保我的默认服务器是当时的“www”实时版本。因此,最终目标是,除非用户指定https://dev.域名.com他们将被重定向到https://www.域名.com

我的 nginx.conf 设置配置为包含“/etc/nginx/etc/sites-enabled/*”。因此,我的配置示例位于“etc/nginx/sites-enabled/www.domainname.com”。

另外,需要澄清的是,当您访问不带 www 的域名时,我当前的配置在加载开发网站时会出现问题。

编辑:我刚刚在本地尝试了这种方法,但“/etc/nginx/sites-enabled/'。有没有更好的解决方案,或者我应该将此配置移到 nginx.conf 中?*

所以我的问题是有没有更好的方法来处理这种类型的设置?

http {

# all traffic should be over https
listen 80 default;

# listen for all server names
server_name *.domainname.com;

# redirect to www with https
return 301 $scheme://www.domainname.com$request_uri;

}

https {

# configuration for all https sites
listen 443 default ssl;
ssl on;

index index.html index.htm index.php;

charset utf-8;

location / {
    try_files $uri $uri/ /index.php?$query_string;
}

location = /favicon.ico { access_log off; log_not_found off; }
location = /robots.txt  { access_log off; log_not_found off; }

access_log off;

error_page 404 /index.php;

location ~ \.php$ {
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass unix:/var/run/php5-fpm.sock;
    fastcgi_index index.php;
    include fastcgi_params;
}

location ~ /\.ht {
    deny all;
}

# configuration for the non-www redirect
server {

    # non-www server name
    server_name domainname.com;
    # return to www
    return 301 $scheme://www.domainname.com$request_uri;

}

# configuration for the live website
server {

    # www server name
    server_name www.domainname.com;

    # root to public directory
    root /path/to/www.domainname.com/public;

    # ssl certificates
    ssl_certificate /etc/nginx/ssl/www.domainname.com/ssl-bundle.crt;
    ssl_certificate_key /etc/nginx/ssl/www.domainname.com/server.key;

    # error logs for www site
    error_log  /var/log/nginx/www.domainname.com-error.log error;

}

# configuration for the dev site
server {

    # dev server name
    server_name dev.domainname.com;

    # root to public directory
    root /path/to/dev.domainname.com/public;

    # ssl certificates - using multi domain ssl
    ssl_certificate /etc/nginx/ssl/www.domainname.com/ssl-bundle.crt;
    ssl_certificate_key /etc/nginx/ssl/www.domainname.com/server.key;

    # error logs for dev site
    error_log  /var/log/nginx/dev.domainname.com-error.log error;

}

}

答案1

如果你的发行版是基于 Debian 的,那么你已经sites-available/default安装了文件。该文件用于配置 nginx 的默认页面。

您需要通过运行其符号链接来禁用此虚拟主机rm sites-enabled/default

然后,您需要创建一个新的,default内容如下:

server {
    listen 80 default_server;
    listen 443 default_server ssl;
    server_name _;

    ssl_certificate /path/to/your/certificate;
    ssl_certificate_key /path/to/your/key;

    redirect 301 https://www.domainname.com$request_uri;
}

此块确保所有未列出的其他域的请求都被重定向到https://www.域名.com

然后,创建另一个文件,例如dev.domainname.com

server {
    listen 443 ssl;

    server_name dev.domainname.com;

    ssl_certificate /path/to/your/certificate;
    ssl_certificate_key /path/to/your/key;

    # Other config for dev.domainname.com
}

此块处理 的请求dev.domainname.com

最后www.domainname.com

server {
    listen 443 ssl;

    server_name www.domainname.com;

    ssl_certificate /path/to/your/certificate;
    ssl_certificate_key /path/to/your/key;

    # Other config for www.domainname.com
}

此块负责处理 的请求www.domainname.com

答案2

你所需要的只是这个:

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

相关内容