Nginx: Khớp tên máy chủ lưu trữ trong chỉ thị vị trí


18

Tôi có nginx chạy nhiều tên miền theo một chỉ thị máy chủ như

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

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

Bây giờ, tôi cần sử dụng chỉ thị vị trí để khớp với tên miền phụ và áp dụng xác thực cơ bản cho nó. Tương đương với

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

Làm thế nào để tôi làm điều này?

Câu trả lời:


16

Bạn có thể sử dụng biểu thức chính quy để chụp tên miền phụ và sau đó sử dụng nó trong vị trí của bạn.

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

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

Ngoài ra, có thể tốt hơn là di chuyển tất cả các cấu hình phổ biến sang một tệp khác, sau đó tạo các khối máy chủ cho mỗi tên miền phụ và bao gồm tệp bên ngoài.

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

    location / {
        ... 
    } 
}

(lặp lại cho các máy chủ khác)


Tôi có thiếu một cái gì đó hay là dòng tên máy chủ bị thiếu ?<>? Tôi tin rằng nó nên như vậyserver_name ~^(?<sub>\.)?(?<domain>.+)$;
Mohammad AbuShady

Bạn hoàn toàn có thể đúng - tôi không thể nghĩ ra bất kỳ lý do nào cho việc đó là như hiện tại, vì vậy tôi đã thay đổi nó thành đề xuất của bạn.
cyberx86

6

Một tùy chọn là trả về lỗi và gửi lỗi đó đến một vị trí xử lý xác thực 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

Bạn không cần sử dụng chỉ thị vị trí nếu bạn sử dụng bản đồ. Đây là giải pháp đơn giản nhất và tương đương tôi có thể nghĩ ra. Bạn có thể đặt tên cho các tệp htpasswd theo $ http_host của bạn, vd 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
Hoạt động như một lá bùa.
conradkleinespel

@Tom Siwik Dù sao tôi cũng có thể điều chỉnh điều này để thực thi các hạn chế IP với allow/ denytheo cùng một cách?
bánh mì nướng

Nếu có thể, bạn có thể ánh xạ qua rất nhiều biến. Xem: nginx.org/en/docs/varindex.html để biết danh sách các biến. Có lẽ bạn sẽ cần $remote_addrthay vì $http_host. Không chắc chắn về phạm vi mặc dù.
Tom Siwik

4

Nếu bạn có nhiều (phụ) lĩnh vực và họ không cư xử chính xác như nhau sau đó bạn sử dụng nhiều blcoks máy chủ. Xin lỗi nhưng đó thực sự là cách tốt nhất, mặc dù bạn sẽ có cấu hình lớn hơn.

Bạn có thể thực hiện hack ghetto bằng cách sử dụng một cái gì đó như if ($ http_host ~ foo) nhưng sau đó rất có thể bạn sẽ chạy theo hành vi không thể đoán trước và kỳ lạ của nếu như được ghi lại ở đây: http://wiki.nginx.org/ IfIsEvil

Đừng cố gắng vượt qua Nginx, chỉ cần sử dụng các tùy chọn mà nó mang lại cho bạn và bạn sẽ bớt đau đầu hơn rất nhiều.

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.