【问题标题】:nginx wildcard subdomain ssl rewritenginx通配符子域ssl重写
【发布时间】:2012-08-09 14:35:53
【问题描述】:

具有通配符 dns 子域记录。使用仅域验证 SSL 证书。 需要这样设置nginx重写规则:

http://site.com   => https://site.com

http://*.site.com => http://*.site.com

我猜是这样的

server {
    listen  80;
    server_name site.com *.site.com;
    if ($host ~* "^([^.]+(\.[^.]+)*)\.site.com$"){
        set $subd $1;
        rewrite ^(.*)$ http://$subd.site.com$1 permanent;
        break;
    }
    if ($host ~* "^site.com$"){
        rewrite ^(.*)$ https://site.com$1 permanent;
        break;
    }
    #rewrite    ^ https://$server_name$request_uri? permanent;
    charset utf-8;
}

server {

    listen   443;

    server_name  site.com;
    ssl On;
    ssl_certificate     /root/site.com.crt;
    ssl_certificate_key /root/site.com.key;

    location ~ \.php$ {
        fastcgi_pass   127.0.0.1:8888;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  /var/www/site$fastcgi_script_name;
        fastcgi_param  QUERY_STRING     $args;
        include fastcgi_params;
    }

    location / {
        root   /var/www/site;
        index  index.php index.html;
        if ($host !~ ^(site.com)$ ) {
            return 444;
        }
        try_files $uri $uri/ /index.php?$args;
    }
}

它无限循环。什么是让这个工作的正确方法?

【问题讨论】:

    标签: redirect nginx ssl-certificate wildcard-subdomain


    【解决方案1】:

    您应该将您的服务器块重写为两部分。 第一部分仅适用于域“site.com”并重定向到 https 第二部分,对于所有其他域,“*.site.com”

    server {
        listen  80;
        server_name site.com;
        rewrite ^(.*)$ https://site.com$1 permanent;
    }
    
    server {
        listen  80;
        server_name *.site.com;
        #etc... rewrites not necessary
    }
    

    所以,你的 nginx.conf 将是:

    服务器 { 听 80; server_name site.com; 重写 ^(.*)$ https://site.com$1 永久; } 服务器 { 听 80; server_name *.site.com; 字符集 utf-8; # 等等 ... } 服务器 { 听443; server_name site.com; ssl开启; ssl_certificate /root/site.com.crt; ssl_certificate_key /root/site.com.key; 位置 ~ \.php$ { fastcgi_pass 127.0.0.1:8888; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /var/www/site$fastcgi_script_name; fastcgi_param QUERY_STRING $args; 包括 fastcgi_params; } 地点 / { 根 /var/www/site; 索引 index.php 索引.html; 如果 ($host !~ ^(site.com)$) { 返回 444; } try_files $uri $uri/ /index.php?$args; } }

    【讨论】:

    • nginx:[警告] 冲突的服务器名称“site.com”在 0.0.0.0:80 被忽略
    • 我想你忘记从你的第二个服务器块的 server_name 中删除 site.com...
    • nginx:[警告] 0.0.0.0:80 上的服务器名称“*.site.com”冲突,因此它们在同一个端口上存在冲突
    • 你完全错了,你应该仔细阅读常见的文档和粒子nginx.org/en/docs/http/server_names.html中基于名称的服务器配置示例
    猜你喜欢
    • 1970-01-01
    • 2014-06-11
    • 2014-02-28
    • 1970-01-01
    • 2014-12-29
    • 2012-08-20
    • 2016-10-21
    • 2013-02-22
    • 2023-03-13
    相关资源
    最近更新 更多