nginx có $scheme
biến có thể sử dụng trong các log_format
dòng của nó .
%H
là giao thức yêu cầu (ví dụ: "HTTP / 1.1").
Làm thế nào tôi có thể làm điều tương tự với Apache?
nginx có $scheme
biến có thể sử dụng trong các log_format
dòng của nó .
%H
là giao thức yêu cầu (ví dụ: "HTTP / 1.1").
Làm thế nào tôi có thể làm điều tương tự với Apache?
Câu trả lời:
Một cách để làm điều đó là có hai CustomLog
chỉ thị có điều kiện , được kiểm soát bởi liệu HTTPS
biến đó có được đặt hay không.
CustomLog logs/access.log "https://..." env=HTTPS
CustomLog logs/access.log "http://..." env=!HTTPS
Tôi cũng đã thử sử dụng SetEnvIf
theo cách sau, nhưng nó không hoạt động (nó ghi nhật ký -
):
SetEnv URL_SCHEME=http
SetEnvIf HTTPS on URL_SCHEME=https
CustomLog logs/access.log "%{URL_SCHEME}e://..."
SetEnvIf
dòng này không hoạt động trên apache <2.4.1 vì mod_setenvif
rõ ràng không có quyền truy cập vào môi trường ssl . gần như khiến tôi phát điên vào ngày 2.2.22.
mod_ssl
chỉ đặt biến môi trường nếu bạn nói rõ ràng để làm như vậy thông qua SSLOptions
.
Vì một số lý do, tôi không thể làm cho các ví dụ trên hoạt động được, vì vậy đã tìm ra một cách khác: bạn có thể thêm 2 quy tắc viết lại vào cấu hình của mình như sau:
RewriteCond %{HTTPS} !=on
RewriteRule ^(.*)$ - [E=SCHEME:HTTP]
RewriteCond %{HTTPS} =on
RewriteRule ^(.*)$ - [E=SCHEME:HTTPS]
Sau đó thêm nó vào định nghĩa LogFormat của bạn.
scheme=\"%{SCHEME}e\"
Vì lược đồ url không có sẵn trực tiếp ở định dạng nhật ký apache, bạn có thể ghi nhật ký cổng chính (ví dụ 80/443) của máy chủ phục vụ yêu cầu bằng cách sử dụng% p thay thế:
CustomLog access.log "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\" port:%p"
Điều này làm việc với tôi với Apache 2.4.23:
LogFormat "%{REQUEST_SCHEME}x ..." my_log_format
%{varname}x
chỉ khả dụng khi mod_ssl được tải, xem: https://httpd.apache.org/docs/trunk/mod/mod_ssl.html#logformats
Xác định đầu ra nhật ký của bạn và thêm% H vào nó. Điều này cũng tương tự đối với Apache.
Vì vậy, bạn xây dựng một LogFormat
như thế này và afaik có một cặp được định nghĩa trong cấu hình apache mặc định.
LogFormat "%h %l %u %t \"%r\" %>s %b" common
và thêm tên của LogFormat (trong trường hợp này là "chung") vào cuối cuộc gọi logfile của bạn
CustomLog logs/access_log common
Chỉ cần nhìn vào đây để biết thêm thông tin về nhật ký và ở đây về các chuỗi định dạng khác nhau.
%H
không làm những gì tôi cần.
mod_env
nỗ lực của bạn có thể đã thất bại vì lỗi cú pháp .SetEnv
lấy biến và giá trị của nó mà không có dấu bằng :SetEnv URL_SCHEME http
.