Я часто работаю с туннелированными портами, где я буду SSH передать удаленный порт 80 локальному порту 8080.
Одна из интересных проблем, с которыми я сталкиваюсь, является этим, когда у меня есть правило как это в NGINX:
rewrite ^/(.+)/$ /$1 permanent;
Переписывание возьмет запрос, который похож на это:
curl -is -X GET http://localhost:8080/one/two/three/
И перенаправьте его к URL как это:
http://localhost/one/two/three
Это разделяет порт от заголовка хоста, и я перенаправляюсь для портирования 80, который развязан и повреждает вещи.
Я могу настроить NGINX для уважения серверного порта (как существующего в заголовке Хоста) при выполнении перенаправлений?
Как видно в заголовках запроса, заголовок Хоста включает порт, и я хотел бы, чтобы NGINX использовал это значение для всех перенаправлений для поддержания исходного порта, клиент раньше получал доступ к серверу.
Моя конфигурация сайта NGINX похожа на это:
server {
listen *:80;
server_name _;
index index.html index.htm;
access_log /var/log/nginx/default.access.log combined;
error_log /var/log/nginx/default.error.log;
location / {
root /vagrant/_site;
index index.html index.htm index.php;
try_files $uri $uri.html $uri/ =404;
}
port_in_redirect on;
server_name_in_redirect off;
}
Точные шаги для репродуцирования похожи на это:
$ curl -is http://localhost:8080/2015/08/from-hell-flying-united-airlines
HTTP/1.1 301 Moved Permanently
Server: nginx/1.8.0
Date: Wed, 02 Sep 2015 19:43:10 GMT
Content-Type: text/html
Content-Length: 184
Location: http://localhost/2015/08/from-hell-flying-united-airlines/
Connection: keep-alive
<html>
<head><title>301 Moved Permanently</title></head>
<body bgcolor="white">
<center><h1>301 Moved Permanently</h1></center>
<hr><center>nginx/1.8.0</center>
</body>
</html>
Я не уверен, почему это перенаправляет для добавления наклонной черты во-первых, но перенаправление повреждает все.
Я исправил проблему интересным способом, который сразу не имеет для меня смысла. Похоже, что try_files
все портит, поэтому я сделал следующее в своей конфигурации, чтобы все работало:
server {
listen *:80;
server_name _;
port_in_redirect on;
server_name_in_redirect off;
index index.html index.htm index.php;
access_log /var/log/nginx/default.access.log combined;
error_log /var/log/nginx/default.error.log;
location / {
rewrite ^/(.+)/+$ $scheme://$http_host/$1 permanent;
root /vagrant/_site;
index index.html index.htm index.php;
try_files $uri $uri/index.html $uri/ =404;
}
}
Моя цель, если не сразу ясно, состоит в том, чтобы сообщения не заканчивались косой чертой.
Моя фактическая структура обслуживаемых каталогов выглядит так:
/vagrant/_site/2015/
`-- 08
`-- from-hell-flying-united-airlines
`-- index.html
Поэтому я говорю NGINX, что для каждого запроса я хочу, чтобы он пытался найти файл в $ uri
, $ uri / index .html
и $ uri /
. Если ничего из этого не работает, верните 404.