NGINX 与 wordpress 多站点 SSL 保护自定义 URL

NGINX 与 wordpress 多站点 SSL 保护自定义 URL

我有一个 Nginx 配置为以 domain.com 为主域的 Wordpress 子域多站点提供服务。

我们用它为我们的客户创建了几个网站,然后他们中的一些人想要一个个性化的网址,在我们的网站中我们拥有customername.domain.com并配置了 Wordpress 网站,以便customerdomain.com在不使用我们的子域的情况下为客户网站提供服务。

我的 Nginx 如下所示:

map $http_host $blogid {
    default       -999;

    #Ref: http://wordpress.org/extend/plugins/nginx-helper/
    #include /var/www/wordpress/wp-content/plugins/nginx-helper/map.conf ;

}

server {
    server_name domain.com *.domain.com ;

    root /var/www/html/portal;
    index index.php;

    access_log /var/log/nginx/nginxwp.access.log combined;
    error_log /var/log/nginx/nginxwp.error.log;

    client_max_body_size 100M;

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


    #WPMU Files
        location ~ \.php$ {
                autoindex on;
                try_files $uri =404;
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
               # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini

                # With php5-fpm:
                #fastcgi_pass unix:/var/run/php5-fpm.sock;
                fastcgi_pass unix:/run/php/php7.0-fpm.sock;
                fastcgi_index index.php;
                include fastcgi_params;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                client_max_body_size 100M;
                proxy_connect_timeout      180;
                proxy_send_timeout         180;
                proxy_read_timeout         180;
        }
        location ~ ^/files/(.*)$ {
                try_files /wp-content/blogs.dir/$blogid/$uri /wp-includes/ms-files.php?file=$1 ;
                access_log off; log_not_found off;      expires max;
        }
}

到这里为止,一切都运行正常。

现在我需要保护我的客户域名。

我怎样才能使用 SSL 证书将我的客户站点提供给域 customerdomain.com,并且保持其他站点HTTP甚至我们的主要站点domain.com不受影响?

答案1

经过大量的研究、尝试和失败,我终于能够以最简单的方式让它发挥作用。

不要忘记对你可能想要保护的域名使用 SAN 证书

我只是将 Wordpress Multisite 当作普通网站来处理。并像对待任何其他单个网站(WP 或非 WP)一样对其进行保护。

至少凭借我对 Nginx 的一点了解,我可以通过重定向到 ssl 侦听器站点 (443) 来保护我的站点。

我没有为每个站点进行单独配置,而是保留了非 SSL 站点(我的网络中的大多数站点)的实际配置,然后使用插件真正简单的 SSL强制仅保护我想要保护的站点。其他站点将继续“按原样”工作。

需要说明的是,此配置适用于多站点子域名。

对于 SSL,我刚刚在 443 端口创建了一个侦听器,并且我执行完全相同的处理以重定向到正确的博客 ID。仅保留一个服务器块,与我未来想要保护的站点数量无关。

我的sites-available & sites-enabled目录中有 3 个文件。

certs.conf
domain.com.conf
ssl_domain.com.conf

证书文件:

ssl_certificate        /customers/certificates/sancert.pem;
ssl_certificate_key    /customers/certificates/sancert.key;

域名.com.conf

map $http_host $blogid {
    default       -999;

    #Ref: http://wordpress.org/extend/plugins/nginx-helper/
    #include /var/www/wordpress/wp-content/plugins/nginx-helper/map.conf ;

}

server {
    server_name domain.com *.domain.com ;

    root /var/www/html/portal;
    index index.php;

    access_log /var/log/nginx/nginxwp.access.log combined;
    error_log /var/log/nginx/nginxwp.error.log;

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


    #WPMU Files
        location ~ \.php$ {
                autoindex on;
                try_files $uri =404;
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
               # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini

                # With php5-fpm:
                #fastcgi_pass unix:/var/run/php5-fpm.sock;
                fastcgi_pass unix:/run/php/php7.0-fpm.sock;
                fastcgi_index index.php;
                include fastcgi_params;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                client_max_body_size       100M;
                proxy_connect_timeout      180;
                proxy_send_timeout         180;
                proxy_read_timeout         180;
        }
        location ~ ^/files/(.*)$ {
                try_files /wp-content/blogs.dir/$blogid/$uri /wp-includes/ms-files.php?file=$1 ;
                access_log off; log_not_found off;      expires max;
        }
}

ssl_域名.com.conf

server {

        listen 443;
        ssl on;
        port_in_redirect off;

        server_name domain.com *.domain.com ;

        root /var/www/html/portal;
        index index.php;

        access_log /var/log/nginx/nginxwp.access.log combined;
        error_log /var/log/nginx/nginxwp.error.log;

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


        #WPMU Files
        location ~ \.php$ {
                autoindex on;
                try_files $uri =404;
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
               # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini

                # With php5-fpm:
                #fastcgi_pass unix:/var/run/php5-fpm.sock;
                fastcgi_pass unix:/run/php/php7.0-fpm.sock;
                fastcgi_index index.php;
                include fastcgi_params;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                client_max_body_size       100M;
                proxy_connect_timeout      180;
                proxy_send_timeout         180;
                proxy_read_timeout         180;
        }
        location ~ ^/files/(.*)$ {
                try_files /wp-content/blogs.dir/$blogid/$uri /wp-includes/ms-files.php?file=$1 ;
                access_log off; log_not_found off;      expires max;
        }

        #WPMU x-sendfile to avoid php readfile()
        location ^~ /blogs.dir {
                internal;
                alias /home/portal/wp-content/blogs.dir;
                access_log off;     log_not_found off;      expires max;
        }

        #add some rules for static content expiry-headers here
        add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload";
        add_header X-Frame-Options DENY;
        add_header X-Content-Type-Options nosniff;
        add_header X-XSS-Protection "1; mode=block";
        add_header X-Robots-Tag none;
}  

在我的 wordpress 中,我已将该网站设置为该网站的自定义域,customerdomain.com并使用插件强制使用 HTTPS真正简单的 SSL

一切都运行良好,在 SSLabs 上获得 A+ 级评价。

希望这可以为下一个研究解决方案的人节省时间

相关内容