В настоящее время я маршрутизирую весь http-трафик на https, определяя следующие серверные блоки для nginx.Nginx routing rewrite config
server {
listen 80;
server_name someserver.xyz www.someserver.xyz;
rewrite^https://someserver.xyz$request_uri? permanent;
}
server {
listen 443;
server_name someserver.xyz;
location/{
proxy_next_upstream error timeout http_500 http_502 http_503 http_504;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_buffer_size 8k;
proxy_http_version 1.1;
proxy_read_timeout 900;
proxy_connect_timeout 900;
proxy_pass http://desktop_upstream;
proxy_redirect off;
}
}
Однако, я не хочу маршрут HTTP трафика HTTPS для конкретного шаблона URL:
http://someserver.xyz/s/[anything]
Ев. http://someserver.xyz/s/blah
не переписывался с http на https. Все остальное, как http://someserver.xyz/dude
, http://someserver.xyz/s
и т. Д., Все равно будет переписываться.
Я попытался модифицировать регулярное выражение в директиве переписывания (чтобы соответствовать все, кроме выше рисунка), а также добавление блока местоположения в 1-ом блоке сервера:
server {
listen 80;
server_name someserver.xyz www.someserver.xyz;
rewrite ^.+\.xyz\/(?!s\/).* https://someserver.xyz$request_uri? permanent;
location/{
proxy_next_upstream error timeout http_500 http_502 http_503 http_504;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_buffer_size 8k;
proxy_http_version 1.1;
proxy_read_timeout 900;
proxy_connect_timeout 900;
proxy_pass http://desktop_upstream;
proxy_redirect off;
}
}
Этот новый блок сервера иногда переписывает весь трафик http на https (из всех шаблонов) и иногда не переписывает любой трафик http на https.
Я знаю, что регулярное выражение работает так, как я его протестировал. Я думаю, что это происходит с http-трафиком:
Он попадает на 1-й серверный блок и определяет, следует ли переписывать https.
Если он переписывает, он ударит по второму серверному блоку и отправится на 2-й серверный блок.
Если он не переписывается, он перейдет на местоположение 1-го блока сервера.
Я делаю что-то неправильно здесь? Спасибо за помощь!
Я попытался это и перезапуском Nginx, но он все еще переписывает шаблон. Я хочу убедиться, что я понимаю '$ request_uri! ~ ^/S /'. '! ~' означает, что он не равен? – Luke
Это означает, что «не соответствует регулярному выражению». И он должен работать, если я правильно понял вашу проблему. – SuddenHead
Думаю, вы хорошо понимаете мою проблему. Оказывается, перенаправления работают на 'www.someserver.xyz', но не' someserver.xyz'. Для 'www.someserver.xyz' я получаю' 301' (я предполагаю, что это код), но для 'someserver.xyz' я получаю' 307' (который, как я полагаю, не установлен). – Luke