Nginx: Menyamakan nama host server dalam arahan lokasi


18

Saya memiliki nginx menjalankan beberapa domain di bawah direktif server tunggal

server {
        listen       80;
        server_name  www.domain.com;
        server_name  x.domain.com;
        server_name  y.domain.com;

----
----
----
}

Sekarang, saya perlu menggunakan arahan lokasi untuk mencocokkan subdomain dan menerapkan autentikasi dasar untuk itu. Setara dengan

location x.domain.com {
        auth_basic "Admin Login";
        auth_basic_user_file /etc/nginx/.htpasswd;
}

Bagaimana saya melakukan ini?

Jawaban:


16

Anda dapat menggunakan ekspresi reguler untuk mengambil subdomain dan kemudian menggunakannya di lokasi Anda.

server {
    server_name   ~^(?<sub>\.)?(?<domain>.+)$;

    location / {
        root   /sites/$sub;
    }
}

Atau, mungkin lebih baik untuk memindahkan semua konfigurasi umum ke file lain, dan kemudian membuat blok server per-subdomain dan memasukkan file eksternal.

server {
        server_name  www.domain.com;
        include /etc/nginx/sites-enabled/default.inc;

    location / {
        ... 
    } 
}

(ulangi untuk server lain)


Apakah saya melewatkan sesuatu atau apakah baris nama server hilang a ?dan <>? Saya percaya itu harusserver_name ~^(?<sub>\.)?(?<domain>.+)$;
Mohammad AbuShady

Anda mungkin benar - saya tidak dapat memikirkan alasan mengapa hal itu terjadi seperti saat ini, jadi saya telah mengubahnya sesuai saran Anda.
cyberx86

6

Salah satu opsi adalah mengembalikan kesalahan dan mengirim kesalahan itu ke lokasi yang menangani otentikasi HTTP:

if ($host = x.domain.com) {
    return 550;
}

error_page 550 = @xauth;

location @xauth {
    auth_basic "Admin Login";
    auth_basic_user_file /etc/nginx/.htpasswd;
}

5

Anda tidak perlu menggunakan arahan lokasi jika Anda menggunakan peta. Ini adalah solusi paling sederhana dan setara yang dapat saya pikirkan. Anda dapat memberi nama file htpasswd menurut $ http_host misalnya x.domain.com.htpasswd.

map $http_host $auth_type {
    default "off";               #This will turn off auth-basic
    x.domain.com "Restricted";   #This or any other string will turn it back on
}

server {
    auth_basic $auth_type;
    auth_basic_user_file /etc/nginx/conf.d/$http_host.htpasswd;
}

1
Bekerja seperti pesona.
conradkleinespel

@ Tom Siwik Pokoknya saya bisa menyesuaikan ini untuk memberlakukan pembatasan IP dengan allow/ denydengan cara yang sama juga?
bersulang

Jika memungkinkan, Anda dapat memetakan lebih banyak variabel. Lihat: nginx.org/en/docs/varindex.html untuk daftar variabel. Anda mungkin perlu $remote_addrbukan $http_host. Tidak yakin tentang rentang.
Tom Siwik

4

Jika Anda memiliki beberapa (sub) domain dan mereka tidak berperilaku sama persis maka Anda menggunakan beberapa server blcoks. Maaf tapi itu serius cara terbaik, meskipun Anda akan memiliki konfigurasi yang lebih besar.

Anda dapat melakukan peretasan ghetto dengan menggunakan sesuatu seperti if ($ http_host ~ foo) tetapi kemudian Anda kemungkinan besar akan bertabrakan dengan perilaku aneh dan tak terduga jika seperti yang didokumentasikan di sini: http://wiki.nginx.org/IfIsEvil

Jangan mencoba mengakali Nginx, cukup gunakan opsi yang memberi Anda dan Anda akan memiliki sakit kepala jauh lebih sedikit.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.