Почему nginx работает с ошибкой 301 HTTP1.1 / перемещено навсегда? - PullRequest
1 голос
/ 20 февраля 2020

Я пытаюсь настроить директиву Location на моем nginx веб-сервере (Ubuntu).

У меня может быть доступ к: http://127.0.0.1/app1/ НО, когда я пытаюсь чтобы получить доступ без sla sh, в конце концов, как: http://127.0.0.1/app1 Я получаю сообщение об ошибке 301 HTTP1.1 / Перемещено постоянно

У меня есть следующий nginx config:

user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

events {
        worker_connections 768;
}

http {

        sendfile on;
        tcp_nopush on;
        tcp_nodelay on;
        keepalive_timeout 65;
        types_hash_max_size 2048;

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

        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;

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

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

Похоже, все в порядке.

И следующий default.conf:

server {
        listen 80 default_server;

        root /var/www/html;
        index index.html index.htm index.nginx-debian.html;

        server_name _;

        location / {
                # First attempt to serve request as file, then
                # as directory, then fall back to displaying a 404.
                try_files $uri $uri/ =404;
        }

        location /app1/ {
                root /var/www/html/;
                index index.html;
                try_files $uri $uri/ /app1/index.html;
        }
}

Curl output http://127.0.0.1/app1/

root@ubuntu-test:/etc/nginx/sites-available# curl 127.0.0.1/app1/ -Iv
*   Trying 127.0.0.1...
* TCP_NODELAY set
* Connected to 127.0.0.1 (127.0.0.1) port 80 (#0)
> HEAD /app1/ HTTP/1.1
> Host: 127.0.0.1
> User-Agent: curl/7.58.0
> Accept: */*
>
< HTTP/1.1 200 OK
HTTP/1.1 200 OK
< Server: nginx/1.14.0 (Ubuntu)
Server: nginx/1.14.0 (Ubuntu)
< Date: Thu, 20 Feb 2020 09:14:12 GMT
Date: Thu, 20 Feb 2020 09:14:12 GMT
< Content-Type: text/html
Content-Type: text/html
< Content-Length: 5
Content-Length: 5
< Last-Modified: Tue, 18 Feb 2020 10:49:53 GMT
Last-Modified: Tue, 18 Feb 2020 10:49:53 GMT
< Connection: keep-alive
Connection: keep-alive
< ETag: "5e4bc151-5"
ETag: "5e4bc151-5"
< Accept-Ranges: bytes
Accept-Ranges: bytes
<
* Connection #0 to host 127.0.0.1 left intact

http://127.0.0.1/app1


root@ubuntu-test:/etc/nginx/sites-available# curl 127.0.0.1/app1 -Iv
*   Trying 127.0.0.1...
* TCP_NODELAY set
* Connected to 127.0.0.1 (127.0.0.1) port 80 (#0)
> HEAD /app1 HTTP/1.1
> Host: 127.0.0.1
> User-Agent: curl/7.58.0
> Accept: */*
>
< HTTP/1.1 301 Moved Permanently
HTTP/1.1 301 Moved Permanently
< Server: nginx/1.14.0 (Ubuntu)
Server: nginx/1.14.0 (Ubuntu)
< Date: Thu, 20 Feb 2020 09:19:31 GMT
Date: Thu, 20 Feb 2020 09:19:31 GMT
< Content-Type: text/html
Content-Type: text/html
< Content-Length: 194
Content-Length: 194
< Location: http://127.0.0.1/app1/
Location: http://127.0.0.1/app1/
< Connection: keep-alive
Connection: keep-alive

Почему это происходит?

1 Ответ

1 голос
/ 20 февраля 2020

Nginx выбирает блок location / для обработки URI /app1, поскольку никакие другие местоположения не являются более подходящими. См. , как Nginx обрабатывает запрос .

Термин $uri/ оператора try_files сообщает Nginx о добавлении / к любому URI, который соответствует каталогу. Каталог /var/www/html/app1 соответствует этому требованию, поэтому создается перенаправление 301 для добавления / к URI. Подробнее см. в этом документе .

Кроме того, поведение по умолчанию для URI, заканчивающегося / и указывающего на каталог, заключается в поиске в этом каталоге файла, соответствующего index директива. Подробнее см. в этом документе .

Возможно отклониться от этого поведения по умолчанию, но вам потребуется внести ряд изменений в свою конфигурацию. location /app1/ нужно потерять трейлинг /, если вы хотите, чтобы он совпадал с /app1. Ваши директивы try_files должны потерять термин $uri/, если вы хотите избежать перенаправления 301. Вы также потеряете обработку по умолчанию index, поэтому директива index будет бесполезна.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...