Bagaimana cara log skema URL (http / https) di Apache?

8

nginx memiliki $schemevariabel yang dapat digunakan dalam log_formatbarisnya.

%H adalah protokol permintaan (mis. "HTTP / 1.1").

Bagaimana saya bisa melakukan hal yang sama dengan Apache?

Vladimir Panteleev
sumber

Jawaban:

3

Salah satu cara untuk melakukannya adalah memiliki dua CustomLogarahan kondisional , dikendalikan oleh apakah HTTPSvariabel diatur.

CustomLog logs/access.log "https://..." env=HTTPS
CustomLog logs/access.log "http://..." env=!HTTPS

Saya juga telah mencoba menggunakan SetEnvIfdengan cara berikut, tetapi tidak berfungsi (log -):

SetEnv URL_SCHEME=http
SetEnvIf HTTPS on URL_SCHEME=https
CustomLog logs/access.log "%{URL_SCHEME}e://..."
Vladimir Panteleev
sumber
1
mod_envusaha Anda mungkin gagal karena kesalahan sintaksis . SetEnvmengambil variabel dan nilai tanpa tanda sama: SetEnv URL_SCHEME http.
glasz
1
juga, SetEnvIfbaris tidak bekerja pada apache <2.4.1 karena mod_setenviftampaknya tidak memiliki akses ke lingkungan ssl . hampir membuatku gila pada 2.2.22.
glasz
Variabel lingkungan ini tampaknya spesifik untuk mod_ssl. Jika Anda menggunakan modul lain, seperti mod_gnutls, Anda tidak memilikinya.
bortzmeyer
Selain itu, mod_sslhanya menetapkan variabel lingkungan jika Anda secara eksplisit menyuruhnya melakukannya via SSLOptions.
Florian Brucker
3

Untuk beberapa alasan saya tidak bisa mendapatkan contoh di atas untuk bekerja, jadi temukan cara lain: Anda dapat menambahkan 2 aturan penulisan ulang ke dalam konfigurasi Anda sebagai berikut:

RewriteCond %{HTTPS} !=on
RewriteRule ^(.*)$ - [E=SCHEME:HTTP]

RewriteCond %{HTTPS} =on
RewriteRule ^(.*)$ - [E=SCHEME:HTTPS]

Kemudian tambahkan ini ke dalam definisi LogFormat Anda.

scheme=\"%{SCHEME}e\"
bstokes
sumber
3

Karena skema url tidak tersedia secara langsung dalam format log apache, Anda dapat mencatat port kanonik (mis. 80/443) dari server yang melayani permintaan dengan menggunakan% p sebagai alternatif:

CustomLog access.log "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\" port:%p"
Stefan
sumber
Bagaimana ini bisa mendapatkan dua upvotes begitu cepat? Bagaimanapun, ini tidak berguna jika Anda ingin secara efektif mencatat URL permintaan, dan Anda membutuhkan skema protokol URI.
Vladimir Panteleev
Port menunjukkan protokol.
Sumbu
3

Ini berfungsi untuk saya dengan Apache 2.4.23:

LogFormat "%{REQUEST_SCHEME}x ..." my_log_format

%{varname}xhanya tersedia ketika mod_ssl dimuat, lihat: https://httpd.apache.org/docs/trunk/mod/mod_ssl.html#logformats

David Caldwell
sumber
httpd.apache.org/docs/current/mod/mod_rewrite.html mendokumentasikan variabel ini.
Artem Russakovskii
Di mana% {VARNAME} x didokumentasikan? httpd.apache.org/docs/current/mod/mod_log_config.html tidak menyebutkan variabel x. Dikonfirmasi bekerja.
Artem Russakovskii
-2

Tentukan output log Anda dan tambahkan% H ke sana. Ini sama untuk Apache.

Jadi, Anda membangun LogFormatseperti ini dan afaik ada pasangan yang ditentukan dalam konfigurasi apache default.

LogFormat "%h %l %u %t \"%r\" %>s %b" common

dan tambahkan nama LogFormat (dalam hal ini "umum") ke akhir panggilan logfile Anda

CustomLog logs/access_log common

Lihat di sini untuk informasi lebih lanjut tentang log dan di sini tentang string format yang berbeda.

Chris
sumber
1
Um ... Saya sudah melihat ke sana. Saya menyatakan dalam pertanyaan saya bahwa %Htidak melakukan apa yang saya butuhkan.
Vladimir Panteleev