nginx перенаправляет запросы подкаталогов без косой черты на URL-адрес с указанным портом

Я есть следующая проблема.

В моей локальной тестовой конфигурации, когда я пытаюсь получить доступ к https: //www.testdomain.local/admin , он всегда будет перенаправлять меня на https: // www .testdomain.local: 8443 / admin / , который не может быть разрешен в моей системе.

Мой nginx работает внутри контейнера Docker, который перенаправляет запросы на порт 443 на порт 8443, где nginx слушает.

Папка admin является подкаталогом корневой папки.

root -> /application/public/testdomain
root/admin -> /application/public/testdomain/admin

Текущее поведение выглядит следующим образом:

https://www.testdomain.local -> https://www.testdomain.local (correct)
https://www.testdomain.local/ -> https://www.testdomain.local (correct)
https://www.testdomain.local/admin/ (with trailing slash) -> https://www.testdomain.local/admin/ (correct)
https://www.testdomain.local/admin (without trailing slash) -> https://www.testdomain.local:8443/admin/ (incorrect)

В последнем случае я предпочитаю следующее:

https://www.testdomain.local/admin -> https://www.testdomain.local:8443/admin or https://www.testdomain.local/admin/

Я пробовал многие решения, которые нашел через Google или ServerFault, но не удалось добиться желаемого поведения.

server {
    listen 8443 ssl;

    server_name www.testdomain.local;
    
    client_max_body_size 108M;

    access_log /var/log/nginx/testdomain.access.log anonymized;

    ssl_certificate /application/common/certificate.crt;
    ssl_certificate_key /application/common/privatekey.key;

    root /application/public/testdomain;
    index index.php;
    
    if (!-e $request_filename) {
        rewrite ^.*$ /index.php last;
    }
    
    location ~ \.php$ {
        fastcgi_pass php:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PHP_VALUE "error_log=/var/log/nginx/application_php_errors.log";
        fastcgi_buffers 16 16k;
        fastcgi_buffer_size 32k;
        include fastcgi_params;
    }
    
}
1
задан 19 July 2020 в 14:00
1 ответ

nginx не знает, что вы на самом деле обслуживаете сайт через порт 443 по умолчанию, поскольку вы сказали ему прослушивать другой порт. Таким образом, когда он создает свои собственные перенаправления, он добавляет нестандартный номер порта.

Вы можете отключить это поведение, отключив port_in_redirect;. Затем nginx будет опускать номер порта в своих перенаправлениях.

Или вы можете отключить абсолютные перенаправления с помощью absolute_redirect off; и все перенаправления будут относиться к корню пути URL. В этом случае nginx будет перенаправлять на /admin/ вместо https://www.testdomain.local:8443/admin/.

1
ответ дан 19 July 2020 в 11:32

Теги

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