Nginx - 301 перемещенный постоянно “проблема”

Как новичок Nginx, у меня есть проблема, которую я не могу решить. В конфигурации веб-сайта Nginx я имею:

server {
       listen 443;
       listen [::]:443;

       ssl on;
       ssl_certificate /etc/letsencrypt/live/website.eu/fullchain.pem;
       ssl_certificate_key /etc/letsencrypt/live/website.eu/privkey.pem;

       server_name website.eu www.website.eu;
       index index.html index.htm index.php;
       root /var/www/website;

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

       location /pihole {
                        alias /var/www/html;
                        try_files $uri $uri/ /admin/index.php?$query_string;
       }

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

Работы веб-сайта, но Pihole был установлен в /var/www/html папка. Если я пытаюсь получить доступ к нему, я добираюсь:

  user@website:~$ curl -i https://www.website.eu/pihole
    HTTP/1.1 301 Moved Permanently
    Server: nginx/1.14.0 (Ubuntu)
    Date: Fri, 01 Nov 2019 11:29:13 GMT
    Content-Type: text/html
    Content-Length: 194
    Location: https://www.website.eu/pihole/
    Connection: keep-alive

Какая-либо идея что не так?

5
задан 1 November 2019 в 04:57

1 ответ

Давайте проверим:

  • Ваша текущая конфигурация try_files директива:

    try_files $uri $uri/ /admin/index.php?$query_string;
    
  • index директива:

    index index.html index.htm index.php;
    
  • Ваш требуемый путь URL /pihole, который соответствует location /pihole, который в свою очередь искажается:

    alias /var/www/html
    

Хорошо, поэтому когда Вы запрашиваете на /pihole ($uri), nginx последовательно сделает:

  • проверьте на $uri во-первых, но это не может соответствовать этому как /pihole alised к местоположению, таким образом, никакой файл не может быть подобран

  • переместитесь на $uri/ затем (это вызывает 301 перенаправление); таким образом, после разрешения alias заключительный путь файловой системы становится /var/www/website/ и затем попытки видеть, существует ли какой-либо файл, отнесенный index в этом каталоге, так попытки index.html, index.htm, index.php последовательно здесь - первый нашел победы, и ответ отправляется.

  • Если второй шаг перестал работать, он переходит на последний т.е. /admin/index.php?$query_string - это - полный путь, таким образом, он подобран с сервера root. Следовательно заключительный путь становится: /var/www/website/admin/index.php?$query_string как root установлен как /var/www/website. Если файл /var/www/website/admin/index.php найден, это передается query_string и получающийся ответ отправляется.

  • Если ничто не соответствует, 404 отправляется в конечном счете.

Как я упомянул ранее в Вашем случае, второе ($uri/) вызывает 301 перенаправление, которое Вы видите. В то время как мы в этом, в случае перенаправления, всегда проверяем Location директива для обнаружения перенаправленного URL:

Location: https://www.website.eu/pihole/ 

Теперь, хорошая практика при использовании location должен использовать запаздывание / если Вы не, делают универсальное/несвязанное соответствие. Так, например, location /pihole соответствия /pihole, /piholefoo, /piholebar и так далее. Но Вы, вероятно, не хотите это. Таким образом, необходимо быть точными в этом случае:

location /pihole/ {
    # Note trailing / here as well
    alias /var/www/html/;
    try_files $uri $uri/ /admin/index.php?$query_string;
}
3
ответ дан 23 November 2019 в 10:25

Другие вопросы по тегам:

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