Jika Anda return 301 https://$host$request_uri;
sebagai respons default pada port 80, maka server Anda cepat atau lambat akan masuk dalam daftar proxy terbuka [1] dan mulai disalahgunakan untuk mengirim lalu lintas ke tempat lain di Internet. Jika log Anda diisi dengan pesan seperti ini, maka Anda tahu itu terjadi pada Anda:
42.232.104.114 - - [25/Mar/2018:04:50:49 +0000] "GET http://www.ioffer.com/i/new-fashion-fine-gold-bracelet-versaec-bracelet-641175733 HTTP/1.1" 301 185 "http://www.ioffer.com/" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; Hotbar 4.1.8.0; RogueCleaner; Alexa Toolbar)"
Masalahnya adalah bahwa $host
akan mengulang kembali apa pun yang dikirim browser di Host
header atau bahkan nama host dari baris pembuka HTTP, seperti ini:
GET http://www.ioffer.com/i/new-fashion-fine-gold-bracelet-versaec-bracelet-641175733 HTTP/1.1
Karena masalah itu, beberapa jawaban lain di sini merekomendasikan menggunakan $server_name
bukan $host
. $server_name
selalu mengevaluasi apa yang Anda masukkan dalam server_name
deklarasi. Tetapi jika Anda memiliki beberapa subdomain di sana atau menggunakan wildcard, itu tidak akan berhasil, karena $server_name
hanya menggunakan entri pertama setelah server_name
deklarasi, dan yang lebih penting hanya akan menggemakan kembali wildcard (tidak memperluasnya).
Jadi bagaimana cara mendukung banyak domain sambil menjaga keamanan? Pada sistem saya sendiri, saya telah menangani dilema ini dengan terlebih dahulu mendaftar default_server
blok yang tidak digunakan $host
, dan kemudian daftar blok wildcard yang:
server {
listen 80 default_server;
server_name example.com;
return 301 https://example.com$request_uri;
}
server {
listen 80;
server_name *.example.com;
return 301 https://$host$request_uri;
}
(Anda juga bisa mencantumkan lebih dari satu domain di blok kedua.)
Dengan kombinasi itu, domain yang tidak cocok akan dialihkan ke tempat yang di-hardcode (selalu example.com
), dan domain yang cocok dengan domain Anda akan menuju ke tempat yang tepat. Server Anda tidak akan berguna sebagai proxy terbuka, sehingga Anda tidak akan menarik masalah.
Jika Anda merasa sulit, saya kira Anda juga bisa membuat default_server
blok tidak cocok dengan domain Anda yang sah dan menyajikan sesuatu yang menyinggung. . . .
[1] Secara teknis "proxy" adalah kata yang salah, karena server Anda tidak keluar dan memenuhi permintaan untuk klien, hanya mengirim redirect, tetapi saya tidak yakin apa kata yang tepat. Saya juga tidak yakin apa tujuannya, tetapi mengisi log Anda dengan noise dan menghabiskan CPU dan bandwidth Anda, jadi sebaiknya Anda menghentikannya.