Nginx regex vhost kalıbı PHP sunucu adı olarak sona eriyor


12

Ben böyle bir regex maç ile bir nginx sunucu tanımı var:

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

Her şey güzel çalışıyor, ancak bu etki alanı, aşağıdaki gibi değerler alan fastcgi ve PHP-FPM kullanan çeşitli PHP projelerine ev sahipliği yapıyor $_SERVER:

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

Gördüğünüz gibi, normal ifade deseni SERVER_NAMEeşleştirdiği dizeden ziyade yerleştirilir . Bu benim için biraz buggy gibi görünüyor ve ayrıca gereksiz ayrıntıları ortaya çıkarması nedeniyle bir güvenlik riskini temsil ediyor (diğer yapılandırmalarda joker karakter yerine belirli bir ad kümesiyle eşleşiyorum).

"SERVER_NAME yerine HTTP_HOST kullan" diyebilirsiniz - ancak bu kadar basit olsaydı - SERVER_NAME sunucusunun (sürpriz yok) sunucunun adını içermesini bekleyen kütüphaneler var. Bu davranış için gerçekten iyi bir kullanım durumu göremiyorum.

Yanıtlar:


14

Bu soruyu yazmanın lastik ördek etkisi sayesinde bir çözüm buldum.

Nginx'in stok fastcgi_paramsdosyası şu satırı içerir:

fastcgi_param  SERVER_NAME        $server_name;

bu değerin $_SERVER['SERVER_NAME']PHP ortamında görünmesine neden olan şey budur .

Ben $ host değişkeni kullanmak için değiştirdim :

fastcgi_param  SERVER_NAME        $host;

ve sorunum ortadan kayboldu. Bu yaklaşımın herhangi bir dezavantajı olup olmadığını bilmek isterim.


Bu yaklaşımın tek dezavantajı $ host değişkenine dayanmasıdır, yani HTTP_HOST üstbilgisi gönderirse kullanıcı tarafından üzerine yazılabilir. Bunu curl: kullanarak test edebilirsiniz curl --header "HOST: google.com" http://yourdomain/yourpage.phpve yourpage.php ifadesinde: <?php echo $_SERVER['SERVER_NAME']; ?>google.com'u göreceksiniz
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
Kod takdir edilmesine rağmen, her zaman eşlik eden bir açıklama olmalıdır. Bu uzun olmak zorunda değil, ama bekleniyor.
peterh - Monica'yı geri yükle
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.