nginx server_name wildcard hoặc Catch-all


118

Tôi có một ví dụ về nginx đang chạy phục vụ một số trang web. Đầu tiên là một thông báo trạng thái trên địa chỉ IP của máy chủ. Thứ hai là bảng điều khiển quản trị trên admin.domain.com. Những công việc tuyệt vời. Bây giờ tôi muốn tất cả các yêu cầu tên miền khác chuyển đến một index.php- tôi có vô số tên miền và tên miền phụ và việc liệt kê tất cả chúng trong một cấu hình nginx là không thực tế.

Cho đến nay tôi đã cố gắng thiết lập server_nameđể *nhưng điều đó đã thất bại như một ký tự đại diện không hợp lệ. *.*hoạt động cho đến khi tôi thêm các khối máy chủ khác, sau đó tôi đoán nó xung đột với chúng.

Có cách nào để chạy một khối máy chủ bắt tất cả trong nginx sau khi các trang web khác đã được xác định không?

NB Tôi không phải là người gửi thư rác, đây là những trang web chính hãng có nội dung hữu ích, chúng chỉ được cung cấp bởi cùng một CMS từ cơ sở dữ liệu!


1
Tốt nhất để sử dụng như là một nguồn chính nginx.org/en/docs/http/server_names.html
stephen

Câu trả lời:


147

Thay đổi tùy chọn nghe này trong khối máy chủ bắt tất cả của bạn. (Thêm default_server) điều này sẽ mất tất cả các kết nối không xác định của bạn (trên cổng được chỉ định).

listen       80  default_server;

nếu bạn muốn đẩy mọi thứ lên index.php nếu tệp hoặc thư mục không tồn tại;

try_files                       $uri /$uri /index.php;

Làm việc hoàn hảo - cảm ơn rất nhiều. Tôi không thể sử dụng server_name _;cho trang trạng thái trên địa chỉ IP, tôi phải chỉ định server_name x.x.x.xnhưng không sao!
Tak

1
Việc thêm default_serverdường như không hoạt động trên nginx 1.4.6, hiện là phiên bản mới nhất trên Ubuntu 14.04 ... Khi tôi thêm nó, configtestlệnh sẽ trả về lỗi và khởi động lại máy chủ cũng không hoạt động. Tôi đã thử cấu hình chính xác trên máy chủ của tôi với Debian jessie, có nginx 1.6.2 và nó hoạt động hoàn hảo. Vì vậy, hãy thử phiên bản khác nếu bạn vào ngày 1.4.6 ...
Nicomak

1
Lưu ý bên lề cho HTTPS: lệnh default_servercũng đặt máy chủ sẽ xử lý bắt tay SSL cho các yêu cầu trên cổng đó. Vì vậy, nếu bạn muốn khối máy chủ A xử lý SSL, nhưng máy chủ B đóng vai trò là điểm thu hút cho HTTPS, thì giải pháp là đặt server_name ~^(.+)$trên máy chủ B.
Luke

65

Một dấu gạch dưới đơn giản cũng hoạt động:

server_name  _;

Nguồn: http://nginx.org/en/docs/http/server_names.html


1
Mặc dù liên kết này có thể trả lời câu hỏi, tốt hơn là bao gồm các phần thiết yếu của câu trả lời ở đây và cung cấp liên kết để tham khảo. Câu trả lời chỉ liên kết có thể trở nên không hợp lệ nếu trang được liên kết thay đổi.
Kmeixner

10
Các liên kết chỉ được cung cấp như một tài liệu tham khảo. Hai dòng trên thực sự là câu trả lời: chỉ cần đặt dấu gạch dưới làm giá trị cho server_name sẽ tạo ra hành vi "bắt tất cả" mong muốn.
jp.gouigoux

54
Câu trả lời này không đúng. Tham chiếu cho thấy rõ rằng điều này sẽ không hoạt động trừ khi bạn cũng có listen 80 default_servertrong cấu hình của mình.
Bọ cánh cứng


2
Có thể tôi đã hiểu nhầm các tài liệu, nhưng "Không có gì đặc biệt về tên này, nó chỉ là một trong vô số các tên miền không hợp lệ không bao giờ giao nhau với bất kỳ tên thật nào. Các tên không hợp lệ khác như là - - và và! được sử dụng như nhau. ". Vì vậy, _chỉ là một tên không hợp lệ ?
Florian Klein

26

Điều này sẽ làm việc:

server_name ~^(.+)$

13
server_name ~.có vẻ hiệu quả hơn
youfu

2
Điều này làm việc cho tôi. Vì bất kỳ lý do gì tôi không thể làm cho default_server hoạt động, nó đã ghi đè tất cả các vhost khác của tôi.
NeuroXc

11

Đối với tôi bằng cách nào đó định nghĩa default_server không hoạt động. Tôi đã giải quyết nó bằng cách

server_name ~^.*$

sử dụng biểu thức chính quy của tất cả.


Đã thử tất cả các tùy chọn được bình chọn cao hơn và đây là lựa chọn duy nhất hoạt động. LƯU Ý: Tôi đang cố gắng truy cập máy chủ có địa chỉ IP so với URL.
Mampersat

9

Chỉ có 1 serverchỉ thị

Từ Tài liệu Nginxlisten

Tham số default_server, nếu có, sẽ khiến máy chủ trở thành máy chủ mặc định cho địa chỉ được chỉ định: cặp cổng. Nếu không có lệnh nào có tham số default_server thì máy chủ đầu tiên có địa chỉ: cặp cổng sẽ là máy chủ mặc định cho cặp này.

Nếu bạn chỉ có 1 serverchỉ thị, sẽ xử lý tất cả yêu cầu, bạn không cần phải đặt bất cứ điều gì.


Nhiều serverchỉ thị

Nếu bạn muốn khớp tất cả các yêu cầu với chỉ serverthị được chỉ định , chỉ cần thêm default_servertham số vào listen, Nginx sẽ sử dụng lệnh này serverlàm mặc định.

server {
    listen 80 default_server;
}

Trong khoảng server_name _;

Từ Tài liệu Nginx

Trong các ví dụ về máy chủ bắt tất cả, có thể thấy cái tên lạ

server {
    listen       80  default_server;
    server_name  _;
    return       444;
}

Không có gì đặc biệt về tên này, nó chỉ là một trong vô số các tên miền không hợp lệ không bao giờ giao nhau với bất kỳ tên thật nào. Các tên không hợp lệ khác như - - và khác! @ # Có thể được sử dụng như nhau.

Không quan trọng server_namebạn đặt gì , nó chỉ là một tên miền không hợp lệ .



2

Nếu bạn cũng muốn bắt các yêu cầu với Hosttiêu đề trống (được phép trong HTTP / 1.0 ), bạn có thể sử dụng cả regex và trống server_name:

server {
    listen      80;
    server_name ~. "";
}
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.