nginx thêm tiêu đề có điều kiện vào một biến ngược dòng_http_


19

Tôi có một proxy ngược trên nginx, nơi ủy nhiệm khá nhiều trang web. Gần đây tôi đã kích hoạt HTTP Strict Transport Security cho tất cả các trang web hỗ trợ SSL. Bây giờ tôi có một trang web không muốn kích hoạt tính năng này.

Tôi nghĩ rằng tôi sẽ chỉ thực hiện một kiểm tra đơn giản nếu thượng nguồn của tôi đã gửi cho tôi một Strict-Transport-Securitytiêu đề, và nếu không, chỉ cần thêm một. Bằng cách đó, ngược dòng của tôi có thể gửi tiêu đề STS có chứa max-age=0để tránh HSTS được bật bởi proxy.

Tôi nghĩ tôi chỉ cần thay đổi cấu hình của mình như sau:

location / {
        proxy_pass http://webservers;

        proxy_redirect off;

        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-Proto "https";

        if ($upstream_http_strict_transport_security = "") {
                add_header Strict-Transport-Security "max-age=15552000";
        }
}

Nhưng, có lẽ bởi vì nếu là xấu xa , điều này không hoạt động. Tôi đã thử một loạt các thứ khác nhau để đảm bảo biến thực sự tồn tại (đó là trường hợp), nhưng dường như không có gì giúp được.

Làm thế nào tôi có thể làm cho công việc này?

Câu trả lời:


22

Điều này không hoạt động vì if được đánh giá trước khi yêu cầu được chuyển đến phần phụ trợ, vì vậy các biến $ upstream_http_ chưa có bất kỳ giá trị nào. add_header với một giá trị trống bị bỏ qua, vì vậy bạn có thể sử dụng bản đồ để thêm tiêu đề một cách có điều kiện như vậy:

map $upstream_http_strict_transport_security $sts {
  '' max-age=15552000;
}

server {
  location / {
    add_header Strict-Transport-Security $sts;
  }
}

1
Khéo léo sử dụng bản đồ!
Alexey Ten

ok tôi đã cố gắng làm điều gì đó khác biệt một chút nhưng tôi không thể tìm ra nginx. Bạn có thể cho tôi biết nơi tôi có thể học nginx chính thức. Và bạn cũng có thể giúp tôi ở đây: serverfault.com/questions/678521/ Kẻ
Muhammad Umer

5

Đó là bởi vì ifđược thực thi trước khi proxy diễn ra và tại thời điểm này không có biến $upstream_http_strict_transport_security.

Bạn có thể sử dụng header_filter_by_luachỉ thị từ mô-đun Lua. Ví dụ

header_filter_by_lua 'if not ngx.header["X-Test"] then ngx.header["X-Test"] = "blah" end';

1
Những công việc này. Trên Debian 7, bạn có thể nhận được hỗ trợ LUA bằng cách sử dụng Nginx từ backport thông qua apt-get -t wheezy-backports install nginx-extras.
Pieter Ennes
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.