Почему правило местоположения nginx «/» не может перехватывать некоторые URL-адреса? Разве это не должно идти со всеми?

У меня есть nginx, который служит обратным прокси-сервером и перенаправляет запросы в приложение angular или бэкэнд-приложение node js. в зависимости от URL-адреса запроса. Также существует правило location ~ /s/(cas)/(.*), которое обслуживает статический контент (хотя сейчас я вижу, что если "/" поймает и этот маршрут, в этом не будет необходимости чтобы иметь это правило, так как статический контент также хранится на сервере: 4000).

Меня особенно беспокоит наиболее общее правило «/», которое должно перехватывать все запросы, которые не попали ни в какое другое место, оно неправильно применяется к некоторым URL-адресам, из-за чего nginx отправляет свои Страница ошибки 50x.html. В частности, моя проблема в том, что это перенаправление, похоже, не захватывает весь трафик, который не соответствовал предыдущему правилу. И это единственное правило, отвечающее за перенаправление трафика, который должен попадать в приложение angular.

Если я прав, это должно подпадать под правило «/»:

https://SUBDOMAIN.DOMAIN.es/user/trip/13925/instant?sharedToken= [УДАЛЕНО]

И эти должен, по крайней мере, правильно перенаправляться по правилу «/», но также показывать страницу сбоя nginx после большого тайм-аута:

https://SUBDOMAIN.DOMAIN.es/user/trip/foo/instant?sharedToken=[REDACTED] # changed id for "foo"
https://SUBDOMAIN.DOMAIN.es/user/trip/instant?sharedToken=[REDACTED] # removed id segment of url
https://SUBDOMAIN.DOMAIN.es/user/instant?sharedToken=[REDACTED] # also removed "trip" segment of url

Любой другой вариант URL-адреса работает нормально и перенаправляется на https: // backend: 4000.

Итак, почему эти правила не улавливаются местоположением «/»?

Это файл конфигурации nginx.Домен и поддомен были опущены намеренно:

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    expires $expires;
    add_header Strict-Transport-Security "max-age=15768000; includeSubDomains" always;
    server_name [SUBDOMAIN].[DOMAIN_NAME].es;
    ssl_certificate /etc/nginx/ssl/CERT.crt;
    ssl_certificate_key /etc/nginx/ssl/CERT.key;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
    ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
    ssl_session_cache shared:SSL:5m;
    ssl_session_timeout 1h;
    gzip on;
    gzip_disable "msie6";
    gzip_vary on;
    gzip_proxied any;
    gzip_comp_level 6;
    gzip_buffers 16 8k;
    gzip_http_version 1.1;
    gzip_min_length 256;
    gzip_types text/plain text/css application/javascript application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/vnd.ms-fontobject application/x-font-ttf font/opentype image/svg+xml image/x-icon;

    location ~ /api(?<url>/.*)  {
        resolver 127.0.0.11;
        set $target http://backend:5000/api${url}$is_args$args;
        proxy_set_header X-Forwarded-Host $host;     # Relay whatever hostname was received
        proxy_set_header X-Forwarded-Proto $scheme;  # Relay either http or https
        proxy_set_header X-Forwarded-Server $host;   # Relay whatever hostname was received
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Prefix /api/;
        proxy_set_header Host "SUBDOMAIN.DOMAIN.es";

        add_header Access-Control-Allow-Origin *;
        add_header Access-Control-Max-Age 3600;
        add_header Access-Control-Expose-Headers Content-Length;
        add_header Access-Control-Allow-Headers Range;

    ## Websockets support 2/2
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
    ## END Websockets support 2/2

        proxy_pass $target;
        client_max_body_size 10M;
    }

    location ^~ /_assets/ {
        alias /usr/share/nginx/html/assets/;
    }

    location ^~ /.well-known/acme-challenge/ {
        alias /usr/share/nginx/html/.well-known/acme-challenge/;
    }

    location ~ /s/(cas)/(.*) {
        add_header Pragma "no-cache";
        add_header Cache-Control "no-store, no-cache, must-revalidate, post-check=0, pre-check=0";
        proxy_pass http://backend:4000;
    }

    location / {
        #root /usr/share/nginx/html;
        proxy_pass http://backend:4000;
        expires -1;
        proxy_set_header X-Forwarded-Host "SUBDOMAIN.DOMAIN.es";
        proxy_set_header X-Forwarded-Server "SUBDOMAIN.DOMAIN.es";
        proxy_set_header Host "SUBDOMAIN.DOMAIN.es";

        add_header Pragma "no-cache";
        add_header Cache-Control "no-store, no-cache, must-revalidate, post-check=0, pre-check=0";

        add_header Access-Control-Allow-Origin *;
        add_header Access-Control-Max-Age 3600;
        add_header Access-Control-Expose-Headers Content-Length;
        add_header Access-Control-Allow-Headers Range;
    }

    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

}
0
задан 28 May 2021 в 15:08
1 ответ

И они должны, по крайней мере, правильно перенаправляться по правилу «/», но также показывать сбой nginx страница после большого тайм-аута:

Это указывает на то, что истекло время ожидания вашего приложения. Страницы ошибок nginx приходят сразу.

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

nginx error.log также является хорошим средством отладки в этом случае.

1
ответ дан 28 July 2021 в 14:06

Теги

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