2013-04-23 40 views
8

Tôi đang cố gắng để chuyển hướng các yêu cầu đến https trong nginx, trừ nó có dạng HOST/ANY_STRING_OF_CHARS/END_OF_URI, ví dụ:URL nginx viết lại bằng regex âm?

http://host.org/about # không chuyển hướng

http://host.org/users/sign_in # chuyển hướng đến https://host.org/users/sign_in

Điều này dường như hoạt động trong Apache, nhưng tôi không hiểu cách hoạt động của bang (bỏ qua nếu nó không thực sự hoạt động):

RewriteRule !/([a-z]+)$ https://%{SERVER_NAME}%{REQUEST_URI} [L,R] 

Làm cách nào để tôi thực hiện điều này trong quy tắc ghi lại nginx? Đây không phải là làm việc như tôi đã hy vọng:

rewrite !/([a-z]+)$ https://$server_name$request_uri redirect; 

này không làm chuyển hướng, hoặc, trong trường hợp tôi có logic ngược:

rewrite /([a-z]+)$ https://$server_name$request_uri redirect; 

Trợ giúp xin vui lòng?

+0

http://stackoverflow.com/a/39549548/1642018 – AMB

Trả lời

20

Gửi một chuyển hướng vĩnh viễn cho khách hàng:

server { 
    listen 80; 
    rewrite ^(/users/\w+)$ https://$host$1 permanent; 
    ... 
} 

trận đấu tiêu cực bạn có thể sử dụng:

if ($request_uri !~ "^/users/\w+$") 
{ 
    return 301 https://$host$request_uri; 
} 
+0

Cảm ơn cho điều này. Tôi đang tìm kiếm kết quả phủ định, nghĩa là không chuyển hướng cho một mẫu cụ thể, chuyển hướng cho _everything_ khác, không chỉ yêu cầu với/người dùng/trong đó. Cuộc gọi tốt trên 'vĩnh viễn', tôi nên làm điều đó. – kbighorse

+0

Tôi đã thêm đối sánh phủ định cho bạn. – Jack

+0

Cảm ơn bạn! điểm thưởng cho một khối vị trí thay thế? Tôi nghe thấy đó là thích hợp hơn nếu, không? – kbighorse

1
set $test "0"; 
if ($request_uri ~ "condition") { 
    set $test "1"; 
} 
if ($test ~ "0") { 
    return 301 redirect url; 
} 
Các vấn đề liên quan