2012-02-26 23 views
68

Tôi có một phiên bản chạy nginx phục vụ một số trang web. Đầu tiên là thông điệp trạng thái trên địa chỉ IP của máy chủ. Thứ hai là bảng điều khiển dành cho quản trị viên 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 miền khác đi đến một đơn index.php - Tôi có vô số tên miền và tên miền phụ và không thể liệt kê tất cả chúng trong cấu hình nginx.nginx server_name wildcard hoặc bắt tất cả

Cho đến giờ tôi đã thử đặt server_name thành * nhưng không thành công 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ó sẽ xung đột với chúng.

Có cách nào để chạy chặn máy chủ lưu trữ tất cả trong nginx sau khi các trang web khác đã được xác định không?

N.B. Tôi không phải là một spammer, đây là những trang web chính hãng với nội dung hữu ích, chúng chỉ được hỗ trợ bởi cùng một CMS từ một cơ sở dữ liệu!

Trả lời

101

Thay đổi tùy chọn nghe này thành tùy chọn này trong khối máy chủ lưu trữ toàn bộ. (Thêm default_server) điều này sẽ lấy tất cả các kết nối không được 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ứ vào index.php nếu tệp hoặc thư mục không tồn tại;

try_files      $uri /$uri /index.php; 
+0

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.x' nhưng điều đó không sao! – Tak

+0

Thêm 'default_server' dường như không hoạt động trên nginx 1.4.6 hiện đang là phiên bản mới nhất trên Ubuntu 14.04 ... Khi tôi thêm nó, lệnh' configtest' trả về lỗi và khởi động lại máy chủ không hoạt động hoặc. Tôi đã thử cấu hình chính xác trên máy chủ của tôi với Debian jessie, trong đó có nginx 1.6.2, và nó hoạt động hoàn hảo. Vì vậy, hãy thử một phiên bản khác nếu bạn đang ở trên 1.4.6 ... – Nicomak

+0

Lưu ý phụ cho HTTPS: chỉ thị '' 'default_server''' cũ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à catchall cho HTTPS, giải pháp là đặt '' 'server_name ~^(. +) $' '' Trên máy chủ B. – Luke

19

này sẽ làm việc:

server_name ~^(.+)$ 
+6

'server_name ~ .' dường như hiệu quả hơn – zhangyoufu

+1

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

34

Một gạch đơn giản làm việc cũng như:

server_name _; 

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

+0

Trong khi liên kết này có thể trả lời câu hỏi, tốt hơn nên 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ở thành không hợp lệ nếu trang được liên kết thay đổi. – Kmeixner

+6

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

+25

Câu trả lời này không đúng. Tham chiếu làm cho nó rõ ràng rằng điều này sẽ không hoạt động trừ khi bạn cũng có 'nghe 80 default_server' trong cấu hình của bạn. – Beetle

3

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

server_name ~^.*$ 

sử dụng cụm từ thông dụng của tất cả.

+0

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

Các vấn đề liên quan