รูปแบบ Nginx regex vhost ลงท้ายด้วยชื่อเซิร์ฟเวอร์ PHP


12

ฉันมีคำจำกัดความเซิร์ฟเวอร์ nginx กับการจับคู่ regex เช่นนี้

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

ทั้งหมดนี้ทำงานได้ดี แต่โดเมนนี้โฮสต์โครงการ PHP ต่างๆโดยใช้ fastcgi และ PHP-FPM ซึ่งได้รับค่าเช่นนี้ใน$_SERVER:

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

อย่างที่คุณเห็นรูปแบบ regex นั้นถูกใส่เข้าไปSERVER_NAMEแทนที่สตริงที่ตรงกับมัน ดูเหมือนว่าจะเป็นรถของฉันและยังแสดงถึงความเสี่ยงด้านความปลอดภัยซึ่งมันเป็นการเปิดเผยรายละเอียดที่ไม่จำเป็น (ในการกำหนดค่าอื่น ๆ ฉันกำลังจับคู่ชุดชื่อที่เจาะจงมากกว่าสัญลักษณ์ตัวแทน)

คุณอาจพูดว่า "ใช้ HTTP_HOST แทน SERVER_NAME" - ถ้าเป็นแบบง่ายๆ - มีห้องสมุดที่คาดว่า SERVER_NAME จะมีชื่อของเซิร์ฟเวอร์ (ไม่แปลกใจ) ฉันไม่เห็นกรณีการใช้งานที่ดีสำหรับพฤติกรรมนี้

คำตอบ:


14

ต้องขอบคุณเอฟเฟกต์เป็ดยางในการเขียนคำถามนี้ฉันจึงพบวิธีแก้ปัญหา

fastcgi_paramsไฟล์สต็อกของ Nginx มีบรรทัด:

fastcgi_param  SERVER_NAME        $server_name;

ซึ่งเป็นสิ่งที่ทำให้ค่าที่ปรากฏใน$_SERVER['SERVER_NAME']สภาพแวดล้อม PHP

ฉันเปลี่ยนสิ่งนั้นเพื่อใช้ตัวแปร $ host :

fastcgi_param  SERVER_NAME        $host;

และปัญหาของฉันก็หายไป ฉันสนใจที่จะทราบว่ามีข้อเสียของวิธีการนี้หรือไม่


ข้อเสียเพียงอย่างเดียวของวิธีการนี้คือเนื่องจากมันใช้ตัวแปร $ host ซึ่งหมายความว่าผู้ใช้สามารถเขียนทับได้หากเขาส่งส่วนหัว HTTP_HOST คุณสามารถทดสอบสิ่งนี้ได้โดยใช้ curl: curl --header "HOST: google.com" http://yourdomain/yourpage.phpและใน yourpage.php ใส่: <?php echo $_SERVER['SERVER_NAME']; ?>คุณจะเห็น 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
แม้ว่ารหัสจะได้รับการชื่นชม แต่ก็ควรมีคำอธิบายประกอบ สิ่งนี้ไม่จำเป็นต้องยาว แต่ก็คาดว่า
peterh - Reinstate Monica
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.