Я есть следующая проблема.
В моей локальной тестовой конфигурации, когда я пытаюсь получить доступ к 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;
}
}
nginx не знает, что вы на самом деле обслуживаете сайт через порт 443 по умолчанию, поскольку вы сказали ему прослушивать другой порт. Таким образом, когда он создает свои собственные перенаправления, он добавляет нестандартный номер порта.
Вы можете отключить это поведение, отключив port_in_redirect;
. Затем nginx будет опускать номер порта в своих перенаправлениях.
Или вы можете отключить абсолютные перенаправления с помощью absolute_redirect off;
и все перенаправления будут относиться к корню пути URL. В этом случае nginx будет перенаправлять на /admin/
вместо https://www.testdomain.local:8443/admin/
.