Cách đặt tiêu đề HSTS từ .htaccess chỉ trên HTTPS [đã đóng]


81

Ứng dụng web của tôi chạy trên một số máy chủ khác nhau mà tôi kiểm soát. Để tránh phải thay đổi cấu hình Apache của mỗi vhost, tôi thêm hầu hết cấu hình bằng cách sử dụng tệp .htaccess trong kho lưu trữ của mình, vì vậy thiết lập cơ bản của mỗi máy chủ lưu trữ chỉ là một vài dòng. Điều này cũng giúp bạn có thể thay đổi cấu hình khi triển khai phiên bản mới. Hiện tại, .htaccess (un) đặt tiêu đề, thực hiện một số phép thuật viết lại và điều khiển bộ nhớ đệm của UA.

Tôi muốn bật HSTS trong ứng dụng bằng cách sử dụng .htaccess. Chỉ cần đặt tiêu đề là dễ dàng:

Header always set Strict-Transport-Security "max-age=31536000"

Nhưng thông số chỉ rõ: "Máy chủ HSTS KHÔNG ĐƯỢC bao gồm trường tiêu đề STS trong các phản hồi HTTP được truyền tải qua phương thức truyền tải không an toàn.". Vì vậy, tôi không muốn gửi tiêu đề khi gửi nó qua các kết nối HTTP. Xem http://tools.ietf.org/html/draft-ietf-websec-strict-transport-sec-14 .

Tôi đã cố gắng đặt tiêu đề bằng cách sử dụng môi trường vars, nhưng tôi bị mắc kẹt ở đó. Bất cứ ai biết làm thế nào để làm điều đó?


Stack Overflow là một trang dành cho các câu hỏi về lập trình và phát triển. Câu hỏi này có vẻ lạc đề vì nó không phải về lập trình hay phát triển. Xem những chủ đề tôi có thể hỏi tại đây trong Trung tâm trợ giúp. Có lẽ Super User hoặc Unix & Linux Stack Exchange sẽ là nơi tốt hơn để hỏi. Ngoài ra, hãy xem Tôi đăng câu hỏi về Dev Ops ở đâu?
jww

6
@jww Các tệp .htaccess là một phần trong kho ứng dụng web của tôi và được các nhà phát triển duy trì để có được hành vi mong muốn của ứng dụng (ví dụ: bộ nhớ đệm, viết lại url và đặt tiêu đề phù hợp). Câu hỏi được xem gần 20 nghìn lần tại đây trên SO (và các thẻ [apache], [.htaccess] và [mod-headers] có sẵn). Vì vậy, tôi không nghĩ nó là lạc đề ở đây.
nielsr

1
"Các tệp .htaccess là một phần trong kho ứng dụng web của tôi và được các nhà phát triển duy trì ..." - Cả hai tiêu chí để đưa vào Stack Overflow đều không. Một thử nghiệm đánh hơi tốt là, bạn có thể hiển thị mã của bạn? Trong trường hợp này, câu trả lời là KHÔNG. Sau khi kiểm tra, nó chỉ là một câu hỏi cấu hình Apache. "Câu hỏi được xem gần 20K lần ..." - Stack Overflow là một bãi rác. Một câu hỏi lạc đề được hỏi ở đây và sau đó nó được lập chỉ mục bởi một công cụ tìm kiếm. Các ví dụ khác của hiện tượng này bao gồm Truyền tệp qua SSH . Các nhà phát triển cũng thỉnh thoảng sử dụng SSH.
jww

Câu trả lời:


110

Rõ ràng có sẵn một biến môi trường HTTPS có thể được sử dụng dễ dàng. Đối với những người có cùng câu hỏi:

Header set Strict-Transport-Security "max-age=31536000" env=HTTPS

2
tập tin cài đặt này được thực hiện trong?
ted.strauss,

7
@ ted.strauss nó sẽ có trong .htaccesshồ sơ.
zen

Vì một số lý do, điều này không hoạt động trên máy chủ của tôi. Apache 2.4
Andy

14
Cũng không hiệu quả với tôi; tuy nhiên "expr=%{HTTPS} == 'on'"việc bổ sung đã hoạt động. Toàn bộ dòng sau đó là Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" "expr=%{HTTPS} == 'on'". Có thể là do alwaystừ khóa?
Adrian Föder

3
Lưu ý rằng HTTPS env var trong điều kiện env=HTTPSkhác với var máy chủ mà chúng ta thường thấy trong điều kiện mod_rewrite (và Apache expr) %{HTTPS}. Vì đây là một biến env nên nó phụ thuộc vào môi trường. cấu hình máy chủ. Đôi khi nó không bao giờ được thiết lập. Đôi khi nó được gán giá trị tương tự như HTTPSvar máy chủ (vì vậy nó luôn được thiết lập để một trong hai "tắt" hoặc "on" - và tình trạng này env=HTTPSluôn luôn đúng! env=HTTPSChỉ đơn giản là kiểm tra xem var env được thiết lập, không phải là nó là "trên" .) Sử dụng giải thưởng Apache như @ AdrianFöder gợi ý được khuyến nghị trên Apache 2.4+
MrWhite

28

Để xây dựng câu trả lời của nielsr, tôi đã sử dụng phần sau trong .htaccess để đáp ứng các đề xuất triển khai an toàn tại https://hstspreload.org sẽ mã hóa miền vào trình duyệt Chrome. Hãy lưu ý rằng điều này sẽ thực thi HSTS trên các miền phụ của bạn và việc đưa vào danh sách tải trước không thể hoàn tác dễ dàng, vì vậy rtfm.

<IfModule mod_headers.c>
Header set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" env=HTTPS
</IfModule>

6
Có một chút an toàn hơn - nếu bạn chỉ có ý định sử dụng HTTPS trên toàn bộ miền của mình. Nếu không, nó cực kỳ nguy hiểm - và vì vậy thật vô trách nhiệm khi đề xuất nó mà không cảnh báo về điều đó. Giả sử máy chủ web của bạn phản hồi bằng tiêu đề này cho một yêu cầu ở tên miền cấp cao nhất (example.com) - sau đó khi bạn đang bao gồm các tên miền phụ, bất kỳ tên miền phụ nào khác được một máy chủ web khác chỉ phân phát qua http chứ không phải https (ví dụ: intranet.example.com) , sẽ không làm việc. Bao gồm thẻ tải trước cũng cho phép điều này được gửi đến danh sách tải trước để nó được mã hóa cứng vào trình duyệt web và sau đó không thể thay đổi được.
Barry Pollard

Đó là một vài năm sau, vì vậy tôi chỉ nhận xét rằng đoạn mã của bạn vẫn còn hiệu quả cho đến ngày hôm nay.
KGIII

6

Bạn có thể sử dụng điều này và đặt nó vào tệp htaccess của mình để tuân thủ https://hstspreload.org . đặt cái này vào tệp .htaccess của bạn.

RewriteCond %{HTTPS} !=on
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]

RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [R=301,L,E=HTTPS:1]
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" env=HTTPS

đầu tiên, nó sẽ chuyển hướng không phải https sang https. và chuyển hướng không phải www https sang www https với tiêu đề HSTS.

( http://example.com -> https://example.com -> https://www.example.com - với tiêu đề HSTS)

Đã kiểm tra và tuân thủ https://hstspreload.org


4

Đối với httpd.conf(nếu bạn có quyền truy cập để chỉnh sửa điều này), bạn có thể sử dụng

<VirtualHost 65.81.122.43:443>
    Header always set Strict-Transport-Security "max-age=31536000; includeSubdomains;"
</VirtualHost>

LƯU Ý: Bạn chỉ cần đặt nó trên HTTPS vhost và không thể đặt trên http vhost.

Khi nào tôi nên và không nên sử dụng tệp .htaccess?

Việc cho phép các tệp .htaccess sẽ khiến Apache tìm kiếm chúng sau mỗi lần truy cập vào máy chủ của bạn. Vì thư mục mẹ cũng được tìm kiếm, điều này sẽ mất một khoảng thời gian (nhỏ) và có thể ảnh hưởng đến hiệu suất máy chủ của bạn. Nguồn


Apache sẽ luôn tìm kiếm các tệp .htaccess. Vì vậy, trừ khi bạn đã tắt tra cứu .htaccess, điều này sẽ không cải thiện hiệu suất, vì Apache vẫn sẽ kiểm tra tệp.
Rudy Broersma

1

Tuy nhiên, một giải pháp thay thế khác là luôn đặt tiêu đề và xóa nó có điều kiện đối với các kết nối không phải ssl:

Header always set   Strict-Transport-Security "max-age=31536000" early
Header        unset Strict-Transport-Security env=!HTTPS

Điều này có ưu điểm là Headerchỉ thị có thể được sử dụng với cả envđiều kiện cũng như earlycờ. Với một Headerchỉ thị duy nhất envearlykhông thể được sử dụng cùng nhau, chúng loại trừ lẫn nhau (xem tài liệu chính thức: https://httpd.apache.org/docs/current/mod/mod_headers.html#header ).

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.