Кажущийся фантомный редирект, который я не могу отследить.

Вопрос или проблема

У меня настроен сервер nginx с тремя файлами в sites-available, связаными симлинком в sites-enabled (default, rss.test1.com, test2.org). Я очистил кэш браузера, убедился, что в кэше fastcgi нет данных (тоже закомментировал в блоках сервера), и я продолжаю получать перенаправление. Я использовал certbot для создания SSL сертификата для rss.test1.com

посещение http://rss.test1.com корректно перенаправляет на https://rss.test1.com

Посещение http://test2.org не пытается обслуживать файлы, оно изменяет URL на https://test2.org и обслуживает файлы с https://rss.test1.com

Я схожу с ума, потому что даже не вижу, что могло бы вызвать перенаправление на втором домене, но где-то в процесс оно устанавливается и выполняется. Я не понимаю, как отследить, откуда приходят ответы или где возникает конфликт. Чувствую, что это либо сертификат SSL, либо кэш fastcgi, хотя я все это закомментировал, просто не могу понять, что искать и пробовать. Я на седьмом часу поиска и пробования всего, что хоть немного похоже на мою проблему, и я боюсь, что в этот момент я действительно что-то испортил…

Надеюсь, что в этом -T дампе найдется что-то, что бросится в глаза более опытным глазам, и я смогу преодолеть это!

nginx -T
nginx: файл конфигурации /etc/nginx/nginx.conf синтаксически корректен
nginx: тест файла конфигурации /etc/nginx/nginx.conf успешен
# файл конфигурации /etc/nginx/nginx.conf:
user www-data;
worker_processes auto;
pid /run/nginx.pid;
error_log /var/log/nginx/error.log;
include /etc/nginx/modules-enabled/*.conf;

events {
        worker_connections 768;
        # multi_accept on;
}

http {

        ##
        # Основные настройки
        ##

        sendfile on;
        tcp_nopush on;
        types_hash_max_size 2048;
        # server_tokens off;
        client_max_body_size 20M;

        # server_names_hash_bucket_size 64;
        # server_name_in_redirect off;

        include /etc/nginx/mime.types;
        default_type application/octet-stream;

        ##
        # Настройки SSL
        ##

        ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Отказ от SSLv3, ref: POODLE
        ssl_prefer_server_ciphers on;

        ##
        # Настройки ведения логов
        ##

        access_log /var/log/nginx/access.log;

        ##
        # Настройки Gzip
        ##

        gzip on;

        # gzip_vary on;
        # gzip_proxied any;
        # gzip_comp_level 6;
        # gzip_buffers 16 8k;
        # gzip_http_version 1.1;
        # gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

        ##
        # Конфигурации виртуальных хостов
        ##

        include /etc/nginx/conf.d/*.conf;
        include /etc/nginx/sites-enabled/*;
}

# файл конфигурации /etc/nginx/modules-enabled/50-mod-http-cache-purge.conf:
load_module modules/ngx_http_cache_purge_module.so;

# файл конфигурации /etc/nginx/mime.types:

types {
    text/html                                        html htm shtml;
    text/css                                         css;
    text/xml                                         xml;
    image/gif                                        gif;
    image/jpeg                                       jpeg jpg;
    application/javascript                           js;
    application/atom+xml                             atom;
    application/rss+xml                              rss;

    text/mathml                                      mml;
    text/plain                                       txt;
    text/vnd.sun.j2me.app-descriptor                 jad;
    text/vnd.wap.wml                                 wml;
    text/x-component                                 htc;

    image/avif                                       avif;
    image/png                                        png;
    image/svg+xml                                    svg svgz;
    image/tiff                                       tif tiff;
    image/vnd.wap.wbmp                               wbmp;
    image/webp                                       webp;
    image/x-icon                                     ico;
    image/x-jng                                      jng;
    image/x-ms-bmp                                   bmp;

    font/woff                                        woff;
    font/woff2                                       woff2;

    application/java-archive                         jar war ear;
    application/json                                 json;
    application/mac-binhex40                         hqx;
    application/msword                               doc;
    application/pdf                                  pdf;
    application/postscript                           ps eps ai;
    application/rtf                                  rtf;
    application/vnd.apple.mpegurl                    m3u8;
    application/vnd.google-earth.kml+xml             kml;
    application/vnd.google-earth.kmz                 kmz;
    application/vnd.ms-excel                         xls;
    application/vnd.ms-fontobject                    eot;
    application/vnd.ms-powerpoint                    ppt;
    application/vnd.oasis.opendocument.graphics      odg;
    application/vnd.oasis.opendocument.presentation  odp;
    application/vnd.oasis.opendocument.spreadsheet   ods;
    application/vnd.oasis.opendocument.text          odt;
    application/vnd.openxmlformats-officedocument.presentationml.presentation
                                                     pptx;
    application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
                                                     xlsx;
    application/vnd.openxmlformats-officedocument.wordprocessingml.document
                                                     docx;
    application/vnd.wap.wmlc                         wmlc;
    application/wasm                                 wasm;
    application/x-7z-compressed                      7z;
    application/x-cocoa                              cco;
    application/x-java-archive-diff                  jardiff;
    application/x-java-jnlp-file                     jnlp;
    application/x-makeself                           run;
    application/x-perl                               pl pm;
    application/x-pilot                              prc pdb;
    application/x-rar-compressed                     rar;
    application/x-redhat-package-manager             rpm;
    application/x-sea                                sea;
    application/x-shockwave-flash                    swf;
    application/x-stuffit                            sit;
    application/x-tcl                                tcl tk;
    application/x-x509-ca-cert                       der pem crt;
    application/x-xpinstall                          xpi;
    application/xhtml+xml                            xhtml;
    application/xspf+xml                             xspf;
    application/zip                                  zip;

    application/octet-stream                         bin exe dll;
    application/octet-stream                         deb;
    application/octet-stream                         dmg;
    application/octet-stream                         iso img;
    application/octet-stream                         msi msp msm;

    audio/midi                                       mid midi kar;
    audio/mpeg                                       mp3;
    audio/ogg                                        ogg;
    audio/x-m4a                                      m4a;
    audio/x-realaudio                                ra;

    video/3gpp                                       3gpp 3gp;
    video/mp2t                                       ts;
    video/mp4                                        mp4;
    video/mpeg                                       mpeg mpg;
    video/ogg                                        ogv;
    video/quicktime                                  mov;
    video/webm                                       webm;
    video/x-flv                                      flv;
    video/x-m4v                                      m4v;
    video/x-matroska                                 mkv;
    video/x-mng                                      mng;
    video/x-ms-asf                                   asx asf;
    video/x-ms-wmv                                   wmv;
    video/x-msvideo                                  avi;
}

# файл конфигурации /etc/nginx/sites-enabled/default:
##
# Вы должны ознакомиться со следующими URL, чтобы получить твердое понимание
# конфигурационных файлов Nginx, чтобы полностью раскрыть мощь Nginx.
# https://www.nginx.com/resources/wiki/start/
# https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/
# https://wiki.debian.org/Nginx/DirectoryStructure
#
# В большинстве случаев администраторы удаляют этот файл из sites-enabled/ и
# оставляют его как эталон внутри sites-available, где он продолжит обновляться
# командой упаковки nginx.
#
# Этот файл автоматически загрузит конфигурационные файлы, предоставленные другими
# приложениями, такими как Drupal или WordPress. Эти приложения будут доступны
# под путями с названием пакета, например /drupal8.
#
# Пожалуйста, смотрите /usr/share/doc/nginx-doc/examples/ для более подробных примеров.
##

# Конфигурация сервера по умолчанию
fastcgi_cache_path /var/www/cache levels=1:2 keys_zone=mfhost_cache:200m max_size=10g inactive=2h use_temp_path=off;
fastcgi_cache_key "$scheme$request_method$host$request_uri";
fastcgi_cache_use_stale error timeout updating invalid_header http_500 http_503;
fastcgi_ignore_headers Cache-Control Expires Set-Cookie;

server {
        server_name _;

        listen 80 default_server deferred;
        listen [::]:80 default_server;

    access_log /var/www/server.access.log;
    error_log /var/www/server.error.log;

        # Добавьте index.php в список, если вы используете PHP
        index index.php index.html index.htm index.nginx-debian.html;

        location / {
                root /var/www/html;
                # Сначала попытаться обслужить запрос как файл, потом
                # как директорию, затем вернуть 404.
                try_files $uri $uri/ =404;
        }
}
# файл конфигурации /etc/nginx/sites-enabled/test2.org:
server{
    server_name test2.org;
    root /var/www/test2.org;
    index index.php index.html index.htm index.nginx-debian.html;

    set $skip_cache 0;

    if ($request_method = POST) {
        set $skip_cache 1;
    }

    if ($query_string != "") {
        set $skip_cache 1;
    }

    if ($request_uri ~* "/wp-admin/|/wp-json/|/xmlrpc.php|wp-.*.php|^/feed/*|/tag/.*/feed/*|index.php|/.*sitemap.*\.(xml|xsl)") {
        set $skip_cache 1;
    }

    if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpress_logged_in") {
        set $skip_cache 1;
    }

    location / {
        try_files $uri $uri/ =404;
    }

    location ~ \.php$ {
        fastcgi_pass unix:/run/php/php8.3-fpm.sock;
        include snippets/fastcgi-php.conf;

        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

        #fastcgi_cache mfhost_cache;
        #fastcgi_cache_valid 200 301 302 1m;
        #fastcgi_cache_min_uses 1;
        #fastcgi_cache_lock on;
        #fastcgi_cache_bypass $skip_cache;
        #fastcgi_no_cache $skip_cache;
        #fastcgi_cache_valid 1m;
        #add_header X-FastCGI-Cache $upstream_cache_status;
    }

    location ~ /purge(/.*) {
          #fastcgi_cache_purge mfhost_cache "$scheme$request_method$host$1";
    }

    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
        expires max;
        log_not_found off;
    }

    location = /robots.txt {
        allow all;
        log_not_found off;
        access_log off;
    }

    location ~ /\.ht {
        deny all;
    }
}
# файл конфигурации /etc/nginx/snippets/fastcgi-php.conf:
# Регулярное выражение для разделения $uri на $fastcgi_script_name и $fastcgi_path
fastcgi_split_path_info ^(.+?\.php)(/.*)$;

# Проверка существования PHP-скрипта перед передачей
try_files $fastcgi_script_name =404;

# Обойти тот факт, что try_files сбрасывает $fastcgi_path_info
# смотрите: http://trac.nginx.org/nginx/ticket/321
set $path_info $fastcgi_path_info;
fastcgi_param PATH_INFO $path_info;

fastcgi_index index.php;
include fastcgi.conf;

# файл конфигурации /etc/nginx/fastcgi.conf:

fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
fastcgi_param  QUERY_STRING       $query_string;
fastcgi_param  REQUEST_METHOD     $request_method;
fastcgi_param  CONTENT_TYPE       $content_type;
fastcgi_param  CONTENT_LENGTH     $content_length;

fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
fastcgi_param  REQUEST_URI        $request_uri;
fastcgi_param  DOCUMENT_URI       $document_uri;
fastcgi_param  DOCUMENT_ROOT      $document_root;
fastcgi_param  SERVER_PROTOCOL    $server_protocol;
fastcgi_param  REQUEST_SCHEME     $scheme;
fastcgi_param  HTTPS              $https if_not_empty;

fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;

fastcgi_param  REMOTE_ADDR        $remote_addr;
fastcgi_param  REMOTE_PORT        $remote_port;
fastcgi_param  REMOTE_USER        $remote_user;
fastcgi_param  SERVER_ADDR        $server_addr;
fastcgi_param  SERVER_PORT        $server_port;
fastcgi_param  SERVER_NAME        $server_name;

# Только для PHP, требуется, если PHP был собран с --enable-force-cgi-redirect
fastcgi_param  REDIRECT_STATUS    200;

# файл конфигурации /etc/nginx/fastcgi_params:

fastcgi_param  QUERY_STRING       $query_string;
fastcgi_param  REQUEST_METHOD     $request_method;
fastcgi_param  CONTENT_TYPE       $content_type;
fastcgi_param  CONTENT_LENGTH     $content_length;

fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
fastcgi_param  REQUEST_URI        $request_uri;
fastcgi_param  DOCUMENT_URI       $document_uri;
fastcgi_param  DOCUMENT_ROOT      $document_root;
fastcgi_param  SERVER_PROTOCOL    $server_protocol;
fastcgi_param  REQUEST_SCHEME     $scheme;
fastcgi_param  HTTPS              $https if_not_empty;

fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;

fastcgi_param  REMOTE_ADDR        $remote_addr;
fastcgi_param  REMOTE_PORT        $remote_port;
fastcgi_param  REMOTE_USER        $remote_user;
fastcgi_param  SERVER_ADDR        $server_addr;
fastcgi_param  SERVER_PORT        $server_port;
fastcgi_param  SERVER_NAME        $server_name;

# Только для PHP, требуется, если PHP был собран с --enable-force-cgi-redirect
fastcgi_param  REDIRECT_STATUS    200;

# файл конфигурации /etc/nginx/sites-enabled/rss.test1.com:
server{
    server_name rss.test1.com;
    root /var/www/rss.test1.com/p;
    index index.php index.html index.htm index.nginx-debian.html;

    set $skip_cache 0;

    if ($request_method = POST) {
        set $skip_cache 1;
    }

    if ($query_string != "") {
        set $skip_cache 1;
    }

    if ($request_uri ~* "/wp-admin/|/wp-json/|/xmlrpc.php|wp-.*.php|^/feed/*|/tag/.*/feed/*|index.php|/.*sitemap.*\.(xml|xsl)") {
        set $skip_cache 1;
    }

    if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpress_logged_in") {
        set $skip_cache 1;
    }

    location / {
        try_files $uri $uri/ =404;
    }

    location ~ \.php$ {
        fastcgi_pass unix:/run/php/php8.3-fpm.sock;
        include snippets/fastcgi-php.conf;

        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

        #fastcgi_cache mfhost_cache;
        #fastcgi_cache_valid 200 301 302 1m;
        #fastcgi_cache_min_uses 1;
        #fastcgi_cache_lock on;
        #fastcgi_cache_bypass $skip_cache;
        #fastcgi_no_cache $skip_cache;
        #fastcgi_cache_valid 1m;
        #add_header X-FastCGI-Cache $upstream_cache_status;
    }

    location ~ /purge(/.*) {
          #fastcgi_cache_purge mfhost_cache "$scheme$request_method$host$1";
    }

    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
        expires max;
        log_not_found off;
    }

    location = /robots.txt {
        allow all;
        log_not_found off;
        access_log off;
    }

    location ~ /\.ht {
        deny all;
    }

    listen 443 ssl; # управляется Certbot
    ssl_certificate /etc/letsencrypt/live/rss.test1.com/fullchain.pem; # управляется Certbot
    ssl_certificate_key /etc/letsencrypt/live/rss.test1.com/privkey.pem; # управляется Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # управляется Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # управляется Certbot
}

server{
    if ($host = rss.test1.com) {
        return 301 https://$host$request_uri;
    } # управляется Certbot

    server_name rss.test1.com;
    listen 80;
    return 404; # управляется Certbot
}
# файл конфигурации /etc/letsencrypt/options-ssl-nginx.conf:
# Этот файл содержит важные параметры безопасности. Если вы вручную измените этот файл,
# Certbot не сможет автоматически предоставлять будущие обновления безопасности. Вместо этого, Certbot
# выведет и запишет сообщение об ошибке с путем к
# актуальному файлу, к которому вам нужно будет обращаться при ручном обновлении
# этого файла. Содержимое основано на https://ssl-config.mozilla.org

ssl_session_cache shared:le_nginx_SSL:10m;
ssl_session_timeout 1440m;
ssl_session_tickets off;

ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers off;

ssl_ciphers "";

Ответ или решение

Рассмотрим вашу проблему с перенаправлением на сервере Nginx. Основная задача в таких случаях — найти источник нежелательного поведения, изучив конфигурацию и логи сервера.

Анализ проблемы

Ваша конфигурация содержит три сайта: по умолчанию, rss.test1.com и test2.org, каждый из которых должен иметь свою собственную конфигурацию. Основная проблема заключается в том, что http://test2.org перенаправляется на https://test2.org, но файлы сервируются с домена https://rss.test1.com. Рассмотрим возможные причины и пути решения:

  1. Конфликт имен серверов.

    • В вашей конфигурации для test2.org отсутствует директива listen 443 ssl, в то время как для rss.test1.com она явно указана. Это может привести к ситуации, когда Nginx не правильно определяет, какой конфигурацией SSL/HTTPS следует управлять конкретным запросом.
  2. Дефолтный сервер.

    • Сервер, указанный с server_name _; и listen 80 default_server, возможно, выступает как дефолтный сервер для всех запросов без схожих определяющих параметров. Убедитесь, что server_name правильно определяется для каждого домена.
  3. Правила перенаправления Certbot.

    • Убедитесь, что правила, устанавливаемые Certbot, корректны. В вашей конфигурации для rss.test1.com есть явно определенное условие для перенаправления запросов с HTTP на HTTPS. Это следует тщательно проверить.
  4. Директивы в конфигурационных файлах.

    • Убедитесь, что в каждом блоке server{} директивы root и server_name соответствуют целевым доменам. Ваша конфигурация root для test2.org должна указывать на реальный каталог с файлами этого сайта: /var/www/test2.org.

Шаги по устранению неисправностей

  1. Проверка конфигураций.

    • Убедитесь, что файлы в sites-available и их символические ссылки в sites-enabled соответствуют ожидаемой конфигурации.
  2. Анализ логов.

    • Проверьте логи ошибок и доступа Nginx (/var/log/nginx/error.log и /var/log/nginx/access.log). Это может дать подсказки о том, какой именно сервер обрабатывает запросы неправильно.
  3. Журнал Certbot.

    • Проверьте журналы обновлений и изменений, произведённых Certbot (/var/log/letsencrypt/letsencrypt.log). Возможно, он вносил изменения, которые не требуются для test2.org.
  4. Конкретизация конфигурации.

    • Добавьте директиву listen 443 ssl в блок server{} для test2.org, обеспечив корректную работу HTTPS через указание сертификатов.
  5. Кеширование.

    • Хотя вы и указали, что директивы кеширования закомментированы, убедитесь, что отсутствие активного кеширования подтверждается отсутствием закомментированных строк в конфигурации при тестировании с командой nginx -T.
  6. Перезапуск Nginx.

    • После внесения изменений в конфигурацию перезагрузите Nginx командой sudo nginx -s reload.

Итог

Точная настройка конфигурации и анализ журналов доступа и ошибок помогут вам определить источник перенаправления и несоответствия. Кроме того, учтите возможность обновление окружения тестирования с помощью изолированных тестовых конфигураций для проверки гипотез. Соблюдение этих шагов должно привести к разрешению возникшей проблемы с перенаправлением.

Оцените материал
Добавить комментарий

Капча загружается...