Nginx regex vhost पैटर्न PHP सर्वर नाम के रूप में समाप्त होता है


12

मैं इस तरह से एक रेगेक्स मैच के साथ एक nginx सर्वर परिभाषा है:

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

यह सब अच्छी तरह से काम करता है, हालांकि, यह डोमेन फास्टगि और PHP-FPM का उपयोग करके विभिन्न PHP परियोजनाओं की मेजबानी करता है, जो इस तरह से मान प्राप्त करते हैं $_SERVER:

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

जैसा कि आप देख सकते हैं, रेगेक्स पैटर्न को SERVER_NAMEउस स्ट्रिंग के बजाय रखा गया है जो इसे मेल खाता है। यह मुझे थोड़ा बुरा लग रहा है, और इसमें एक सुरक्षा जोखिम भी है कि यह अनावश्यक विवरणों का खुलासा कर रहा है (अन्य कॉन्फ़िगरेशन में मैं वाइल्डकार्ड के बजाय नामों के एक विशेष सेट का मिलान कर रहा हूं)।

आप कह सकते हैं "SERVER_NAME के ​​बजाय HTTP_HOST का उपयोग करें" - यदि केवल यह इतना सरल था - ऐसी लाइब्रेरी हैं जो SERVER_NAME से उम्मीद करती हैं (कोई आश्चर्य नहीं) में सर्वर का नाम शामिल है। मैं वास्तव में इस व्यवहार के लिए एक अच्छा उपयोग मामला नहीं देख सकता।

जवाबों:


14

इस प्रश्न को लिखने के रबर-बतख प्रभाव के लिए धन्यवाद, मुझे एक समाधान मिला।

Nginx के स्टॉक fastcgi_paramsफ़ाइल में पंक्ति है:

fastcgi_param  SERVER_NAME        $server_name;

जो कि उस मूल्य को $_SERVER['SERVER_NAME']PHP वातावरण में दिखाई देने का कारण बनता है ।

मैंने $ होस्ट चर का उपयोग करने के लिए उसे बदल दिया :

fastcgi_param  SERVER_NAME        $host;

और मेरी समस्या दूर हो गई। मुझे यह जानने में दिलचस्पी होगी कि क्या इस दृष्टिकोण के कोई डाउनसाइड्स हैं या नहीं।


इस दृष्टिकोण के लिए केवल नकारात्मक यह है कि यह $ होस्ट चर पर निर्भर है, जिसका अर्थ है कि इसे उपयोगकर्ता द्वारा अधिलेखित किया जा सकता है यदि वह HTTP_HOST शीर्ष लेख भेजता है। आप इसे कर्ल का उपयोग करके परीक्षण कर सकते हैं: curl --header "HOST: google.com" http://yourdomain/yourpage.phpऔर अपने page.php पुट में: <?php echo $_SERVER['SERVER_NAME']; ?>आप google.com देखेंगे
गुलाम अली

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
हालांकि कोड की सराहना की जाती है, लेकिन इसका हमेशा साथ होना चाहिए। यह लंबा होना जरूरी नहीं है, लेकिन यह अपेक्षित है।
पेटेर - मोनिका
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.