![NGINX 与 wordpress 多站点 SSL 保护自定义 URL](https://linux22.com/image/720068/NGINX%20%E4%B8%8E%20wordpress%20%E5%A4%9A%E7%AB%99%E7%82%B9%20SSL%20%E4%BF%9D%E6%8A%A4%E8%87%AA%E5%AE%9A%E4%B9%89%20URL.png)
我有一个 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+ 级评价。
希望这可以为下一个研究解决方案的人节省时间