Làm cách nào để đăng nhập lược đồ URL (http / https) trong Apache?


8

nginx có $schemebiến có thể sử dụng trong các log_formatdò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:


3

Một cách để làm điều đó là có hai CustomLogchỉ thị có điều kiện , được kiểm soát bởi liệu HTTPSbiế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 SetEnvIftheo 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://..."

1
mod_envnỗ lực của bạn có thể đã thất bại vì lỗi cú pháp . SetEnvlấy biến và giá trị của nó mà không có dấu bằng : SetEnv URL_SCHEME http.
glasz

1
Ngoài ra, SetEnvIfdòng này không hoạt động trên apache <2.4.1 vì mod_setenvifrõ 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.
glasz

Biến môi trường này có vẻ đặc trưng cho mod_ssl. Nếu bạn sử dụng một mô-đun khác, chẳng hạn như mod_gnutls, bạn không có nó.
bortzmeyer

Ngoài ra, mod_sslchỉ đặ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.
Florian Brucker

3

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\"

3

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"

Làm thế nào điều này có được hai upvote nhanh chóng như vậy? Dù sao, điều này không hữu ích nếu bạn muốn ghi lại các URL của yêu cầu một cách hiệu quả mà bạn cần lược đồ URI giao thức.
Vladimir Panteleev 7/2/2015

Cổng chỉ ra giao thức.
Bấc

3

Đ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}xchỉ khả dụng khi mod_ssl được tải, xem: https://httpd.apache.org/docs/trunk/mod/mod_ssl.html#logformats



Mặc dù% {VARNAME} x được ghi lại ở đâu? httpd.apache.org/docs/civerse/mod/mod_log_config.html không đề cập đến x biến. Khẳng định làm việc mặc dù.
Artem Russakovskii

-2

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 LogFormatnhư 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ýở đây về các chuỗi định dạng khác nhau.


1
Ừm ... Tôi đã nhìn ở đó. Tôi đã nói trong câu hỏi của tôi rằng %Hkhông làm những gì tôi cần.
Vladimir Panteleev
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.