Mẫu vhost của Nginx regex kết thúc là tên máy chủ PHP


12

Tôi có một định nghĩa máy chủ nginx với một trận đấu regex, như thế này:

server_name ~^(?<vhost>[a-z0-9-]+)\.example\.com$;
root /var/www/example/$vhost;
access_log /var/log/nginx/$vhost.example-access.log;

Tuy nhiên, tất cả đều hoạt động tốt, tuy nhiên, miền này lưu trữ các dự án PHP khác nhau bằng cách sử dụng fastcgi và PHP-FPM, nhận các giá trị như thế này trong $_SERVER:

SERVER_NAME => "~^(?<vhost>[a-z0-9-]+)\.example\.com$"
HTTP_HOST   => "myhost.example.com"

Như bạn có thể thấy, mẫu regex được đưa vào SERVER_NAMEchứ không phải là chuỗi mà nó khớp. Điều đó có vẻ hơi lỗi đối với tôi và cũng thể hiện rủi ro bảo mật ở chỗ nó tiết lộ các chi tiết không cần thiết (trong các cấu hình khác tôi khớp với một bộ tên cụ thể hơn là ký tự đại diện).

Bạn có thể nói "sử dụng HTTP_HOST thay vì SERVER_NAME" - nếu chỉ đơn giản như vậy - có những thư viện mong đợi SERVER_NAME (không có gì bất ngờ) chứa tên của máy chủ. Tôi thực sự không thể thấy một trường hợp sử dụng tốt cho hành vi này.

Câu trả lời:


14

Nhờ hiệu ứng vịt cao su khi viết câu hỏi này, tôi đã tìm ra giải pháp.

fastcgi_paramsTệp chứng khoán của Nginx chứa dòng:

fastcgi_param  SERVER_NAME        $server_name;

đó là nguyên nhân khiến giá trị đó xuất hiện trong $_SERVER['SERVER_NAME']môi trường PHP.

Tôi đã thay đổi điều đó để sử dụng biến $ host :

fastcgi_param  SERVER_NAME        $host;

và vấn đề của tôi đã biến mất. Tôi muốn biết liệu có bất kỳ nhược điểm nào của phương pháp này không.


Nhược điểm duy nhất của phương pháp này là nó phụ thuộc vào biến $ host, có nghĩa là nó có thể bị ghi đè bởi người dùng nếu anh ta gửi tiêu đề HTTP_HOST. Bạn có thể kiểm tra điều này bằng cách sử dụng curl: curl --header "HOST: google.com" http://yourdomain/yourpage.phpvà trong yourpage.php đặt: <?php echo $_SERVER['SERVER_NAME']; ?>Bạn sẽ thấy google.com
Ghulam Ali

2
server_name  ~^(?<subdomain>.+)\.example\.com$;
set $server_name_full $subdomain.example.com;


location ~ \.php$ {
    ...
    include fastcgi_params;
    fastcgi_param SERVER_NAME $server_name_full;
    ...
}

3
Mặc dù mã được đánh giá cao, nó phải luôn có một lời giải thích đi kèm. Điều này không phải là dài, nhưng nó được mong đợi.
peterh - Tái lập Monica
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.