2015-07-17 14 views
24

tập tin cấu hình của tôi có một khối server chỉ thị bắt đầu với ...

server { 
    server_name www.example1.com www.example2.com www.example3.com; 

... để cho phép trang web được truy cập với các tên miền khác nhau.

Tuy nhiên PHP $_SERVER['SERVER_NAME'] luôn trả về nhập đầu tiên của server_name, trong trường hợp này http://www.example1.com

Vì vậy, tôi không có cách nào từ mã PHP để biết được miền người dùng sử dụng để truy cập vào trang web.

Có cách nào để yêu cầu nginx/fastcgi chuyển tên miền thực được sử dụng để truy cập trang web không?


Giải pháp duy nhất tôi đã tìm thấy cho đến nay là để lặp lại toàn bộ server khối cho từng lĩnh vực với một server_name entry riêng biệt nhưng rõ ràng tôi đang tìm kiếm một tốt hơn.

+1

có lẽ sử dụng máy chủ trong mã của bạn thay vì -http: //wiki.nginx.org/HttpCoreModule#.24host – edmondscommerce

+0

Tại sao không tạo ra 3 file cấu hình trang web trong nginx dưới \ etc \ nginx \ sites-available cho mỗi trang web trỏ đến cùng một vị trí? –

+0

@maytham tất nhiên tôi có thể làm điều đó nhưng nó là chính xác những gì tôi đang cố gắng để tránh (nhân rộng các tập tin cấu hình giống nhau) – Paolo

Trả lời

31

Đặt SERVER_NAME để sử dụng $host trong cấu hình fastcgi_params của bạn.

fastcgi_param SERVER_NAME   $host; 

Nguồn: http://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_param

+0

Lên tiếng bình chọn cho bạn, nhưng tại sao hành vi mặc định này lại không hợp lý với tôi. Tại sao nó sử dụng mục đầu tiên trong khối server_name thay thế. – David

7

Đây là mục đích và giải pháp thích hợp là sử dụng $_SERVER['HTTP_HOST'] trong mã của bạn thay thế.

Bạn nên giải thích SERVER_NAME làm xác minh tên máy chủ và HTTP_HOST làm người dùng nhập có thể được sửa đổi khá dễ dàng và do đó không đáng tin cậy.

+0

cảm ơn bạn. Đây là giải pháp đơn giản nhất và tôi có thể sẽ đi với nó. Tuy nhiên tôi muốn tìm cách sử dụng 'SERVER_NAME'' vì nó là tên của máy chủ ảo vì nó được định nghĩa là ** nginx ** xử lý yêu cầu áp dụng các chỉ thị cấu hình. ''HTTP_HOST'' xuất phát trực tiếp từ tiêu đề yêu cầu (nếu khách hàng gửi nó). Tất nhiên một ** nginx ** được cấu hình đúng sẽ từ chối các yêu cầu với tiêu đề máy chủ http không hợp lệ làm cho '' HTTP_HOST'' đáng tin cậy ... – Paolo

+0

Tôi hiểu rằng bạn đang cố gắng xác thực một phần xác thực trong cấu hình nginx của mình; nhưng như bạn đã đề cập, một nginx được cấu hình đúng sẽ chỉ cho phép các mục * HTTP_HOST * hợp lệ. Việc xử lý HTTP_ * là không đáng tin cậy như đầu vào người dùng khác vẫn là một ý tưởng hay. Sự khác biệt giữa 'SERVER_NAME' và' HTTP_HOST' khá hữu ích nếu bạn hiểu sự khác biệt – Sjon

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