Pola nginx regex vhost berakhir sebagai nama server PHP

12

Saya memiliki definisi server nginx dengan kecocokan regex, seperti ini:

server_name ~^(?<vhost>[a-z0-9-]+)\.example\.com$;
root /var/www/example/$vhost;
access_log /var/log/nginx/$vhost.example-access.log;

Namun, semua itu bekerja dengan baik, domain ini meng-host berbagai proyek PHP menggunakan fastcgi dan PHP-FPM, yang menerima nilai seperti ini di $_SERVER:

SERVER_NAME => "~^(?<vhost>[a-z0-9-]+)\.example\.com$"
HTTP_HOST   => "myhost.example.com"

Seperti yang Anda lihat, pola regex dimasukkan ke dalam SERVER_NAMEdaripada string yang cocok. Itu tampak agak buggy bagi saya, dan juga merupakan risiko keamanan karena mengungkapkan detail yang tidak perlu (di konfigurasi lain saya mencocokkan satu set nama khusus daripada wildcard).

Anda bisa mengatakan "gunakan HTTP_HOST alih-alih SERVER_NAME" - jika hanya sesederhana itu - ada perpustakaan yang mengharapkan SERVER_NAME (tidak mengherankan) berisi nama server. Saya benar-benar tidak dapat melihat kasus penggunaan yang baik untuk perilaku ini.

Sinkron
sumber

Jawaban:

14

Berkat efek bebek-karet menulis pertanyaan ini, saya menemukan solusinya.

fastcgi_paramsFile stok Nginx berisi baris:

fastcgi_param  SERVER_NAME        $server_name;

yang menyebabkan nilai tersebut muncul di $_SERVER['SERVER_NAME']lingkungan PHP.

Saya mengubahnya untuk menggunakan variabel $ host :

fastcgi_param  SERVER_NAME        $host;

dan masalah saya hilang. Saya akan tertarik untuk mengetahui jika ada kelemahan dari pendekatan ini.

Sinkron
sumber
Satu-satunya downside ke pendekatan ini adalah karena ini bergantung pada variabel $ host, yang berarti dapat ditimpa oleh pengguna jika ia mengirim header HTTP_HOST. Anda dapat mengujinya menggunakan curl: curl --header "HOST: google.com" http://yourdomain/yourpage.phpdan di yourpage.php: <?php echo $_SERVER['SERVER_NAME']; ?>Anda akan melihat google.com
Ghulam Ali
2
server_name  ~^(?<subdomain>.+)\.example\.com$;
set $server_name_full $subdomain.example.com;


location ~ \.php$ {
    ...
    include fastcgi_params;
    fastcgi_param SERVER_NAME $server_name_full;
    ...
}
Filippok
sumber
3
Meskipun kode dihargai, itu harus selalu memiliki penjelasan yang menyertainya. Ini tidak harus lama, tetapi diharapkan.
peterh