NGINX с многосайтовым SSL-адресом wordpress с защитой настраиваемого URL-адреса

У меня есть Nginx, настроенный для обслуживания мультисайта поддомена Wordpress с основным доменом как domain.com.

Мы используйте его для создания нескольких сайтов для наших клиентов, затем некоторым из них нужен персонализированный URL-адрес, на нашем сайте у нас есть 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 нетронутым?

0
задан 5 April 2018 в 20:37
1 ответ

После долгих исследований, попыток и неудач я смог заставить его работать самым простым способом.

Не забудьте использовать сертификат SAN для доменов, которые вы хотите защитить

Я только что обработал Wordpress Multisite как обычный сайт. И защитите его, как и любой другой отдельный сайт (WP или нет).

По крайней мере, обладая небольшими знаниями о Nginx, я защищаю свои сайты, выполняя перенаправление на сайт прослушивателя ssl (443).

Вместо того, чтобы делать одиночный конфигурации для каждого сайта, я сохранил фактическую конфигурацию для сайтов без SSL (большинство в моей сети), а затем использовал плагин Really Simple SSL для принудительной защиты только сайта, который я хотел защитить. Остальные будут продолжать работать «как есть».

Важно отметить, что эта конфигурация работает для поддомена мультисайта.

Для ssl я только что создал прослушиватель в порту 443, и я делаю точно такое же лечение для перенаправления к правому идентификатору блога. Сохранение только одного серверного блока, независимо от того, сколько сайтов я хочу защитить в будущем.

У меня в каталоге sites-available & sites-enabled есть 3 файла.

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

Certs file:

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

domain.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_domain.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 с помощью плагина Really Simple SSL

Все работает отлично, с оценкой A + на SSLabs.

Надеюсь, это поможет сэкономить время для следующего исследования решения

1
ответ дан 4 December 2019 в 15:59

Теги

Похожие вопросы