nginx расположение 404 не найдено

Вот мои файлы конфигурации nginx.

В default.conf первое местоположение используется для доступа к каталогу / usr / share / nginx / html, это нормально, пока я получаю доступ к http://47.91.152.99. Но когда я добавляю новое местоположение для каталога / usr / share / nginx / public, nginx возвращает мне страницу 404, пока я получаю доступ к http://47.91.152.99/test.

Итак, в чем дело? Я неправильно использую директиву nginx?

/etc/nginx/nginx.conf

user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


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

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

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

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}


/etc/nginx/conf.d/default.conf
server {
    listen       80;
    server_name  localhost;

    #charset koi8-r;
    #access_log  /var/log/nginx/log/host.access.log  main;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

    location ^~ /test/ {
        root /usr/share/nginx/public;
        index index.html index.htm;
    }
    #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;
    }
}

person jamesxu-e.g.    schedule 12.12.2016    source источник
comment
Вы имеете в виду http://47.91.152.99/test/ (с завершающим /)? Файл находится в /usr/share/nginx/public/test/index.html?   -  person Richard Smith    schedule 12.12.2016
comment
Да, с завершающим /. А index.html находится в директории.   -  person jamesxu-e.g.    schedule 13.12.2016
comment
index.html в каком каталоге? Ваш вопрос подразумевает /usr/share/nginx/public, но в вашем файле конфигурации используется /usr/share/nginx/public/test   -  person Richard Smith    schedule 13.12.2016


Ответы (4)


Следующий ошибочный блок (в вашем случае);

 location ^~ /test/ {
     root /usr/share/nginx/public;
     index index.html index.htm;
 }

сообщает nginx искать каталог test в папке (корне) / usr / share / nginx / public. Если в этом корне нет «тестовой» папки, будет возвращено 404. Чтобы решить вашу проблему, я предлагаю вам попробовать использовать псевдоним вместо root. Вот так:

 location ^~ /test/ {
     alias /usr/share/nginx/public;
     index index.html index.htm;
 }

Кроме того, просто для удовольствия, директива index может быть установлена ​​в целом, поэтому вам не нужно постоянно ее переписывать ... вот так;

 server {
     listen       80;
     server_name  localhost;

     root   /usr/share/nginx/html;
     index  index.html index.htm;

     error_page   500 502 503 504  /50x.html;

     location / { }

     location ~^/test/ {
         alias /usr/share/nginx/public;
     }

     location = /50x.html {
         root   /usr/share/nginx/html;
     }
 }

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

Надеюсь, это поможет.

person OldFart    schedule 12.12.2016
comment
Не работает. Я все еще получаю ответ 404 not found. - person jamesxu-e.g.; 13.12.2016
comment
При доступе к URL-адресу 47.91.152.99/test я хочу, чтобы сервер nginx имел доступ к корневому каталогу / usr / share / nginx / public. - person jamesxu-e.g.; 13.12.2016
comment
Он будет соответствовать запросам, начинающимся с / images / (location / также соответствует таким запросам, но имеет более короткий префикс). Итоговая конфигурация серверного блока должна выглядеть так: server {location / {root / data / www; } местоположение / изображения / {корень / данные; }} - person jamesxu-e.g.; 13.12.2016
comment
После того, как я создам тестовый каталог в / usr / share / nginx / public, ответ будет нормальным. Спасибо за ответ. - person jamesxu-e.g.; 13.12.2016

Ошибка, вызванная корневой директивой

location ^~ /test/ {
    root /usr/share/nginx/public;
    index index.html index.htm;
}

Исправить с помощью директивы псевдонима

 location ^~ /test/ {
     alias /usr/share/nginx/public;
     index index.html index.htm;
 }

Прочие улучшения

Дополнительный совет: директиву index можно настроить так, чтобы вам не приходилось ее переписывать.

server {
    listen       80;
    server_name  localhost;

    root   /usr/share/nginx/html;
    index  index.html index.htm;

    error_page   500 502 503 504  /50x.html;

    location / { }

    location ~^/test/ {
        alias /usr/share/nginx/public;
    }

    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

nginx соответствует блокам Location частично на основе позиции в config. В идеале вы бы перевернули то, что у вас есть сейчас. Блок местоположения будет выше в конфигурации nginx. С этой целью location = /50x.html также переместится вверх. Заказ

  1. Точное совпадение =
  2. Прямое совпадение ^ ~ /
  3. Регулярное выражение с учетом регистра ~ /
  4. Регулярное выражение без учета регистра ~ *
  5. Соответствие пути /

Подробнее о приоритете местоположения nginx. Также вы всегда можете ознакомиться с официальной документацией. Документация nginx для блока местоположения http://nginx.org/en/docs/http/ngx_http_core_module.html#location

person gtzilla    schedule 11.11.2018
comment
Комментарий модератора: это изменение предназначено для обращения к автору сообщения и не имеет смысла как изменение. Это должно было быть написано как комментарий или ответ. Комментарий был недостаточно длинным. Что бы вы предпочли? - person gtzilla; 30.11.2018

когда ваше приложение vuejs , вам нужно написать вот так, может предотвратить 404, обратите внимание на double / test /

   location ^~/test/ {
       alias /usr/local/soft/vuejs/;
       try_files $uri $uri/ /test/index.html;
    }
person yongfa365    schedule 22.06.2020

В моем случае, если вы размещаете несколько сайтов, проверьте server_name, что это может быть неправильно указано. Взгляни и на это.

person The Keeper    schedule 12.12.2019