Рейтинг:0

Сервер Nginx под балансировщиком нагрузки, когда /folder найден, перенаправляется в /folder/, но меняет URL-адрес хоста

флаг yt

У меня настроен сервер nginx в облаке Google. Доступ к серверу осуществляется из хост-домена через gcloud.

Как это:

https://server.com/test/ указывает на группу экземпляров с одним из экземпляров с ip http://39.99.99.99.55/project/

И все работает хорошо, если вы не вводите

https://server.com/test/folder без косой черты

Когда вы делаете это, хост-сервер перенаправляет на https://server.com/project/folder/ которая не является назначенной папкой в ​​хост-домене.

Но если вы введете его правильно: https://server.com/test/папка/ он работает правильно, резолвится на ip-сервер и получает результат.

Итак, сервер с nginx пытается найти папку и делает редирект.

Тем не менее, я не хочу, чтобы он перенаправлялся с использованием относительного пути сервера, я хочу, чтобы у него был путь к хосту с балансировкой нагрузки, например: https://server.com/test/папка следует перенаправить на https://server.com/test/папка/ нет https://server.com/project/folder/

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

сервер {
    слушать 80 default_server;
    слушать [::]:80 default_server;

    корень /дом/.www;

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

    имя сервера _;

    # включен автоиндекс;

    # обслуживать статические файлы напрямую
    расположение ~* \.(jpg|jpeg|gif|css|png|js|ico|html)$ {
        доступ_лог выключен;
        #истекает макс;
    }

    журнал_ошибок /home/.log/xerror.log;

    access_log /home/.log/xaccess.log сжатие;

    # включить проект
    расположение ^~ /проект {
      псевдоним /home/.www/project/public;
      try_files $uri $uri/ @project;

      расположение ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
        fastcgi_index index.php;
        fastcgi_read_timeout 180;
        включить fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $request_filename;
      }
    }

    местоположение @проект {
        переписать /project/(.*)$ /project/index.php последним;
    }



    место расположения / {

        # Сначала пытаемся обслужить запрос как файл, затем
        # в качестве каталога, затем вернуться к отображению 404.
        try_files $uri $uri/ /index.php?$args;

    }

    # передать PHP-скрипты на сервер FastCGI
    расположение ~ \.php$ {
        включить фрагменты/fastcgi-php.conf;

        # С php-fpm (или другими сокетами unix):
        fastcgi_pass unix:/run/php/php8.1-fpm.sock;
        fastcgi_read_timeout 180;
        # С php-cgi (или другими сокетами tcp):
        # fastcgi_pass 127.0.0.1:9000;
    }
} 

Как сделать, чтобы сервер не перенаправлял так при нахождении папки?

Изменить 1 @Иван Шацкий

попросил получить curl -v server.com/test/папка вывод из запроса, вот он:

* Попытка 35.***.160.34:443...
* Установлен TCP_NODELAY
* Подключен к server.com (35.***.160.34) порт 443 (#0)
* ALPN, предлагая h2
* ALPN, предлагающий http/1.1
* успешно установить места проверки сертификата:
* CA-файл: /etc/ssl/certs/ca-certificates.crt
  CApath: /etc/ssl/certs
* TLSv1.3 (OUT), рукопожатие TLS, приветствие клиента (1):
* TLSv1.3 (IN), рукопожатие TLS, приветствие сервера (2):
* TLSv1.3 (IN), рукопожатие TLS, зашифрованные расширения (8):
* TLSv1.3 (IN), рукопожатие TLS, сертификат (11):
* TLSv1.3 (IN), рукопожатие TLS, проверка CERT (15):
* TLSv1.3 (IN), рукопожатие TLS, Готово (20):
* TLSv1.3 (OUT), изменение шифрования TLS, изменение спецификации шифрования (1):
* TLSv1.3 (OUT), рукопожатие TLS, Готово (20):
* SSL-соединение с использованием TLSv1.3/TLS_AES_256_GCM_SHA384
* ALPN, сервер принят для использования h2
*Сертификат сервера:
* тема: CN=server.com
* дата начала: 25 апреля 19:19:01 2022 GMT
* срок действия: 24 июля 19:19:00 2022 GMT
* subjectAltName: хост "server.com" соответствует сертификату "server.com"
* эмитент: C=US; O = Google Trust Services LLC; CN = ГТС СА 1D4
* Проверка сертификата SSL в порядке.
* Используя HTTP2, сервер поддерживает многократное использование
* Состояние соединения изменено (HTTP/2 подтверждено)
* Копирование данных HTTP/2 из буфера потока в буфер соединения после обновления: len=0
* Использование идентификатора потока: 1 (простой дескриптор 0x556617a0f2f0)
> ПОЛУЧИТЬ /test/quasar HTTP/2
> Хост: server.com
> пользовательский агент: curl/7.68.0
> принять: */*
>
* TLSv1.3 (IN), рукопожатие TLS, билет на выпуск новостей (4):
* TLSv1.3 (IN), рукопожатие TLS, билет на выпуск новостей (4):
* старый идентификатор сеанса SSL устарел, удаление
* Состояние соединения изменено (MAX_CONCURRENT_STREAMS == 100)!
< HTTP/2 301
< сервер: nginx/1.20.2
<дата: пн, 23 мая 2022 г., 21:04:50 по Гринвичу
<тип содержимого: текст/html
<длина содержимого: 169
< расположение: http://server.com/project/folder/
< через: 1.1 гугл
<alt-svc: h3=":443"; ма=2592000,ч3-29=":443"; ма=2592000
<
<html>
<head><title>301 перемещен навсегда</title></head>
<тело>
<center><h1>301 перемещен навсегда</h1></center>
<hr><center>nginx/1.20.2</center>
</тело>
</html>
* Соединение №0 с хостом server.com осталось нетронутым

Таким образом, похоже, что он попадает на мой сервер nginx и возвращает перенаправление 301, но в папке, которая у него есть внутри /project/folder/folder, что правильно для этого сервера, но становится неверным после того, как оно распространяется на хост-сервер, который должен быть server.com/тест/папка/ и нет server.com/проект/папка/.

Ivan Shatsky avatar
флаг gr
Я не вижу в вашей конфигурации ничего, что могло бы вызвать такое перенаправление. Можете ли вы запустить `curl -v https://server.com/test/folder` и добавить вывод к своему вопросу?
флаг yt
@IvanShatsky, только что добавил результат `curl -v`
Ivan Shatsky avatar
флаг gr
Я полностью потерян. Во-первых, вы жалуетесь, что https://server.com/test/folder перенаправляет на https://server.com/project/folder/. Затем вы показываете запрос, в котором `https://server.com/project/folder` перенаправляется на `https://server.com/project/folder/` (что является ожидаемым поведением, если `/home/ .www/project/folder` - это существующий каталог в вашей локальной файловой системе. Каков ваш вопрос на самом деле?
флаг yt
@IvanShatsky Извините, я отредактировал редактирование, я сделал запрос на `https://server.com/test/folder`, и он перенаправляется на `https://server.com/project/folder/`. Я не ошибся в своем запросе на завивку, просто когда я набрал ответ вам.
флаг yt
@IvanShatsky, любые идеи будут оценены, спасибо
Richard Smith avatar
флаг jp
Самое простое решение — использовать `test` вместо `project` в вашей конфигурации Nginx, чтобы gcloud указывал `/test` на `/test`.

Ответить или комментировать

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