2015-02-03 11 views
2

В настоящее время я маршрутизирую весь 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. Он попадает на 1-й серверный блок и определяет, следует ли переписывать https.

  2. Если он переписывает, он ударит по второму серверному блоку и отправится на 2-й серверный блок.

  3. Если он не переписывается, он перейдет на местоположение 1-го блока сервера.

Я делаю что-то неправильно здесь? Спасибо за помощь!

ответ

1

Ваш второй переписан не будет работать, потому что вы пытаетесь соответствовать всю строку запроса, включая доменную часть, но переписывает работу URIs

Вот что вам нужно

server { 
    listen 80; 
    server_name someserver.xyz www.someserver.xyz; 
    if ($request_uri !~ ^/s/) { 
    return 301 https://someserver.xyz$request_uri?; 
    } 
    # continue without redirect 
} 

Я изменил «переписать» на «возврат» только потому, что мне это нравится больше, кажется немного более читаемым :)

+0

Я попытался это и перезапуском Nginx, но он все еще переписывает шаблон. Я хочу убедиться, что я понимаю '$ request_uri! ~ ^/S /'. '! ~' означает, что он не равен? – Luke

+0

Это означает, что «не соответствует регулярному выражению». И он должен работать, если я правильно понял вашу проблему. – SuddenHead

+0

Думаю, вы хорошо понимаете мою проблему. Оказывается, перенаправления работают на 'www.someserver.xyz', но не' someserver.xyz'. Для 'www.someserver.xyz' я получаю' 301' (я предполагаю, что это код), но для 'someserver.xyz' я получаю' 307' (который, как я полагаю, не установлен). – Luke

0

с использованием двух блоков местоположения на сервере HTTP может решить эту проблему просто, не делая любого, если условия

server { 
    listen 80; 
    server_name example.com www.example.com; 
    root /path/to/root; 
    location ^~ /s/(.+) { 
    # try_files or whatever; 
    } 
    location/{ 
    return 301 https://$server_name$request_uri; 
    } 
} 
server { 
    listen 443 ssl; 
    server_name example.com; 
    root /path/to/root; 
    location/{ 
    # the whole proxy here 
    } 
}