Итак, у меня есть веб-сайт WordPress, работающий за nginx -> лак -> httpd
Правило htaccess для wp-login.php установлено как:
<Files wp-login.php>
allow from client ip
deny from all
</Files>
Раньше это работало нормально без использования лака, но когда я поместил лак посередине между nginx и httpd, возникла проблема с кэшированием или переадресацией IP.
Поскольку я могу легко изменить конфигурацию веб-сервера, я могу легко отключить/включить лак для сайта. Итак, в качестве теста я изменил правило htaccess на:
<Files wp-login.php>
allow from Server Public IP
deny from all
</Files>
Это сделало wp-login доступным для всех. Затем я отключил лак и оставил публичный IP-адрес сервера в htaccess, и теперь никто не может получить доступ к странице (что и должно произойти).
Итак, виноват лак.
У меня настроен mod_cloudflare на apache. Я также проверил, переключив его на mod_remoteip, но безрезультатно.
Вот мои шаблоны vhost nginx: 443, лак: 82 и apache: 8181 (этот IP-адрес 108.148.54.124 является примером для общедоступного IP-адреса сервера):
сервер {
    слушать 108.148.54.124:443 ssl http2;
    server_name %domain_idn% %alias_idn%;
    
    access_log /usr/local/apache/domlogs/%domain%.bytes bytes;
    журнал доступа /usr/local/apache/domlogs/%domain%.log заполнен;
    error_log /usr/local/apache/domlogs/%domain%.error.log ошибка;
    ssl_certificate %ssl_cert_path%/%domain%.bundle;
    ssl_certificate_key %ssl_key_path%/%domain%.key;
    ssl_протоколы TLSv1.3;
    ssl_ciphers EECDH+ECDSA+AESGCM:EECDH+aRSA+AESGCM:EECDH+ECDSA+SHA384:EECDH+ECDSA+SHA256:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH+aRSA!RC4:EECDH:!RC4:!aNULL :!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS;
    ssl_prefer_server_ciphers включен;
    ssl_session_cache общий: SSL: 10 м;
    ssl_session_timeout 60 м;
    место расположения / {
        расположение ~.*\.(3gp|gif|jpg|jpeg|png|ico|wmv|avi|asf|asx|mpg|mpeg|mp4|pls|mp3|mid|wav|swf|flv|html|htm|txt |js|css|exe|zip|tar|rar|gz|tgz|bz2|uha|7z|doc|docx|xls|xlsx|pdf|iso|woff|ttf|svg|eot|sh|webp)$ {
            корень %docroot%;
            истекает макс.;
            try_files $uri $uri/ @backend;
        }
        
        error_page 405 = @backend;
        error_page 500 = @custom;
        add_header X-Cache «УДАЛ из бэкенда»;
        add_header Strict-Transport-Security "max-age=31536000";
        add_header X-XSS-Защита "1; режим = блок" всегда;
        add_header X-Content-Type-Options «нюхать» всегда;
        proxy_pass %proxy_protocol%://108.148.54.124:82;
        включить proxy.inc;
    }
    местоположение @backend {
        внутренний;
        proxy_pass %proxy_protocol%://108.148.54.124:82;
        включить proxy.inc;
    }
    местоположение @custom {
        внутренний;
        proxy_pass %proxy_protocol%://108.148.54.124:82;
        включить proxy.inc;
    }
    расположение ~ .*\.(php|jsp|cgi|pl|py)?$ {
        proxy_pass %proxy_protocol%://108.148.54.124:82;
        включить proxy.inc;
    }
    местоположение ~ /\.ht {запретить все;}
    местоположение ~ /\.svn/ {запретить все;}
    местоположение ~ /\.git/ {запретить все;}
    местоположение ~ /\.hg/ {запретить все;}
    расположение ~ /\.bzr/ {запретить все;}
    location ~\.(ini|log|conf)$ {запретить все;error_page 403 =404 / ;}
    disable_symlinks if_not_owner from=%docroot%;
    местоположение /.well-known/acme-challenge {
        default_type "текст/обычный";
        псевдоним /usr/local/apache/autossl_tmp/.well-known/acme-challenge;
    }
    местоположение /.well-known/pki-validation {
        default_type "текст/обычный";
        псевдоним /usr/local/apache/autossl_tmp/.well-known/acme-challenge;
    }
}
.....
серверная часть %backend_domain% {
    .хост = "108.148.54.124";
    .порт = "8181";
}
суб vcl_recv {
    если (req.http.host ~ "%domain%") {
        установить req.backend_hint = %backend_domain%;
        # Всегда кэшировать следующие типы файлов для всех пользователей.
        если (req.url ~ "(?i)\.(png|gif|jpeg|jpg|ico|swf|css|js|html|htm)(\?[a-z0-9]+)?$") {
            отключить req.http.Cookie;
        }
        # Удалите все файлы cookie на основе Google Analytics
        установить req.http.Cookie = regsuball(req.http.Cookie, "has_js=[^;]+(; )?", "");
        установить req.http.Cookie = regsuball(req.http.Cookie, "__utm.=[^;]+(; )?", "");
        установить req.http.Cookie = regsuball(req.http.Cookie, "_ga=[^;]+(; )?", "");
        установить req.http.Cookie = regsuball(req.http.Cookie, "utmctr=[^;]+(; )?", "");
        set req.http.Cookie = regsuball(req.http.Cookie, "utmcmd.=[^;]+(; )?", "");
        set req.http.Cookie = regsuball(req.http.Cookie, "utmccn.=[^;]+(; )?", "");
        # Не кэшировать запросы AJAX.
        если (req.http.X-Requested-With == "XMLHttpRequest") {
            вернуться (пройти);
        }
        # Почтовые запросы не будут кэшироваться
        if (req.http.Authorization || req.method == "POST") {
            вернуться (пройти);
        }
        if (req.method!= "GET" && req.method!= "HEAD") {
            вернуться (пройти);
        }
        # Не кэшировать авторизованные запросы.
        если (треб.http.Авторизация) {
            вернуться (пройти);
        }
        # Прохождение LetsEncrypt Certbot
        if (req.url ~ "^/\.well-known/acme-challenge/") {
            вернуться (пройти);
        }
        if (req.url ~ "^/\.well-known/pki-validation/") {
            вернуться (пройти);
        }
        # Переадресация IP клиента на серверную часть
        если (треб. перезапусков == 0) {
            если (треб.http.X-Real-IP) {
                установить req.http.X-Forwarded-For = req.http.X-Real-IP;
            } иначе если (req.http.X-Forwarded-For) {
                установить req.http.X-Forwarded-For = req.http.X-Forwarded-For + ", " + client.ip;
            } еще {
                установить req.http.X-Forwarded-For = client.ip;
            }
        }
        ### Вордпресс ###
        if (req.url ~ "(wp-admin|post\.php|edit\.php|wp-логин)") {
            вернуться (пройти);
        }
        if (req.url ~ "/wp-cron.php" || req.url ~ "preview=true") {
            вернуться (пройти);
        }
        # WP-партнерка
        если ( req.url ~ "\?ref=" ) {
            вернуться (пройти);
        }
        set req.http.Cookie = regsuball(req.http.Cookie, "wp-settings-1=[^;]+(; )?", "");
        set req.http.Cookie = regsuball(req.http.Cookie, "wp-settings-time-1=[^;]+(; )?", "");
        установить req.http.Cookie = regsuball(req.http.Cookie, "wordpress_test_cookie=[^;]+(; )?", "");
        set req.http.Cookie = regsuball(req.http.Cookie, "PHPSESSID=[^;]+(; )?", "");
        возврат (хэш);
    }
}
<VirtualHost 108.148.54.124:8443>
    ServerName %domain_idn%
    %domain_aliases%
    ServerAdmin webmaster@%domain%
    DocumentRoot %docroot%
    UseCanonicalName Off
    ScriptAlias /cgi-bin/ %docroot%/cgi-bin/
    CustomLog /usr/local/apache/domlogs/%domain%.bytes bytes
    CustomLog /usr/local/apache/domlogs/%domain%.log combined
    ErrorLog /usr/local/apache/domlogs/%domain%.error.log
    ## Custom settings are loaded below this line (if any exist)
    # IncludeOptional "/usr/local/apache/conf/userdata/%user%/%domain%/*.conf"
    SSLEngine on
    SSLCertificateFile %ssl_cert_path%/%domain%.cert
    SSLCertificateKeyFile %ssl_key_path%/%domain%.key
    SSLCertificateChainFile %ssl_cert_path%/%domain%.bundle
    SetEnvIf User-Agent ".*MSIE.*" nokeepalive ssl-unclean-shutdown
    <IfModule mod_userdir.c>
        UserDir disabled
        UserDir enabled %user%
    </IfModule>
    <IfModule mod_suexec.c>
        SuexecUserGroup %user% %group%
    </IfModule>
    <IfModule mod_suphp.c>
        suPHP_UserGroup %user% %group%
        suPHP_ConfigPath %home%/%user%
    </IfModule>
    <IfModule mod_ruid2.c>
        RMode config
        RUidGid %user% %group%
    </IfModule>
    <IfModule itk.c>
        AssignUserID %user% %group%
    </IfModule>
    <Directory "%docroot%">
        AllowOverride All
        SSLRequireSSL
        Require all granted
    </Directory>
    <IfModule proxy_fcgi_module>
        <FilesMatch \.php$>
            SetHandler "proxy:%backend_fcgi%|fcgi://localhost"
        </FilesMatch>
    </IfModule>
</VirtualHost>
и это основной файл конфигурации nginx:
пользователь никто;
рабочие_процессы авто;
#worker_rlimit_nofile 65535;
error_log /var/log/nginx/error.log крит;
pid /var/run/nginx.pid;
События {
    worker_connections 1024;
    использовать эполл;
    мульти_принять;
}
http {
    отправить файл включен;
    tcp_nopush включен;
    tcp_nodelay включен;
    client_header_timeout 3 минуты;
    client_body_timeout 3 м;
    client_max_body_size 256 м;
    client_header_buffer_size 4k;
    client_body_buffer_size 256 КБ;
    large_client_header_buffers 4 32 КБ;
    send_timeout 3 м;
    keepalive_timeout 60 60;
    reset_timedout_connection включен;
    server_names_hash_max_size 1024;
    server_names_hash_bucket_size 1024;
    ignore_invalid_headers включено;
    connection_pool_size 256;
    request_pool_size 4 КБ;
    output_buffers 4 32k;
    отложить_выход 1460;
    включить mime.types;
    default_type application/octet-stream;
    # Сжатие gzip
    gzip включен;
    gzip_vary включен;
    gzip_disable "MSIE [1-6]\.";
    gzip_proxy любой;
    gzip_min_length 512;
    gzip_comp_level 6;
    gzip_buffers 8 64k;
    gzip_types text/простой текст/xml text/css text/js application/x-javascript application/xml image/png image/x-icon image/gif image/jpeg image/svg+xml application/xml+rss text/javascript application/ приложение atom+xml/приложение javascript/приложение json/шрифт x-font-ttf/opentype;
    # Настройки прокси
    прокси_перенаправление выключено;
    proxy_set_header Хост $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass_header Set-Cookie;
    proxy_connect_timeout 300;
    proxy_send_timeout 300;
    proxy_read_timeout 300;
    proxy_buffers 32 4k;
    proxy_cache_path /var/cache/nginx level=2 keys_zone=cache:10m inactive=60m max_size=512m;
    proxy_cache_key "$host$request_uri $cookie_user";
    proxy_temp_path /var/cache/nginx/temp;
    proxy_ignore_headers Истекает Cache-Control;
    proxy_cache_use_stale ошибка timeout invalid_header http_502;
    proxy_cache_valid любой 1d;
    open_file_cache_valid 120 с;
    open_file_cache_min_uses 2;
    open_file_cache_errors выключен;
    open_file_cache макс. = 5000 неактивных = 30 с;
    open_log_file_cache max=1024 inactive=30s min_uses=2;
    # Настройки SSL
    ssl_session_cache общий: SSL: 10 м;
    ssl_протоколы TLSv1.3;
    ssl_prefer_server_ciphers включен;
    ssl_ciphers "EECDH+ECDSA+AESGCM:EECDH+aRSA+AESGCM:EECDH+ECDSA+SHA384:EECDH+ECDSA+SHA256:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH+aRSA!RC4:EECDH:!RC4:! aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS";
    # Журналы
    log_format main '$remote_addr - $remote_user [$time_local] $request '
                        '"$status" $body_bytes_sent "$http_referer" '
                        '"$http_user_agent" "$http_x_forwarded_for"';
    log_format full '[$time_local] $remote_addr $remote_user - "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" "$http_x_forwarded_for"';
    log_format bytes '$body_bytes_sent';
    #access_log /var/log/nginx/access.log основной;
    доступ_лог выключен;
    # Обход кеша
    карта $http_cookie $no_cache {
        по умолчанию 0;
        ~СЕСС 1;
        ~wordpress_logged_in 1;
    }
    # Включить дополнительную конфигурацию
    включить /etc/nginx/cloudflare.inc;
    включить /etc/nginx/conf.d/*.conf;
}