Kendine yönelik URL'lerin

6 Cevap php

Bir özüne URL oluşturmak için en güvenilir, genel yolu nedir? [: Port] kullanıcının tarayıcı isabet URL kısmını diğer bir deyişle, ben http://www.site.com oluşturmak istiyorum. Ben Apache altında PHP çalışan kullanıyorum.

Birkaç komplikasyonlar:

  • Birisi sahte olabilir HTTP Host başlığında, düz geliyor gibi görünüyor, çünkü $ _SERVER ["HTTP_HOST"] dayanarak, tehlikelidir.

  • Veya sanal host var olmayabilir.

  • Orada Apache Liman yönergesini kullanarak belirtilen bir liman olabilir, ama bir yük dengeleyici veya vekaleten arkasında eğer, kullanıcı belirtilen bağlantı noktası olmayabilir.

  • Liman aslında URL'nin parçası olmayabilir. Örneğin, 80 ve 443 genellikle ihmal edilir.

  • PHP'nin $ _SERVER ["HTTPS"] her zaman bir yük dengeleyici veya proxy arkasında konum, özellikle eğer, güvenilir bir değer vermez.

  • Apache SERVER_NAME ve SERVER_PORT ortam değişkenlerinin değerlerini etkileyen bir UseCanonicalName yönergesine sahiptir. Biz yardımcı olur, bu, açık varsayabiliriz.

6 Cevap

En güvenilir yolu kendiniz sağlamaktır.

Site nötr hostname için kodlanmış olmalıdır, ama özel bir yapılandırma dosyası hakkında bilmek. Bu web sunucusu yapılandırmasına ait çünkü bu dosya kod temeli için kaynak denetimi içine koymak almaz. Dosya hostname ve diğer web sunucusu-özel parametreler gibi şeyler ayarlamak için kullanılır. Eğer bir HTTP isteği bu kodu vurursa, o zaman ne kadar bunu varsayalım varsayalım söyleyerek çünkü, vb portları, değişen, yük dengeleyici konaklayabilir.

Bu hile de tesadüfen, gelişimine yardımcı olur. :-)

Ben emin olmak için ve güvenli olması için tek yol site için yapılandırma dosyasının çeşit url için bir sabit tanımlamak olduğunu öneririm. Eğer varsayılan olarak $ _SERVER ['HTTP_HOST'] ile sürekli üretmek ve güvenlik gerçekten önemli dağıtımları bir sabit kodlanmış tanımı ile yerini alabilir.

define('SITE_URL', $_SERVER['HTTP_HOST']);

ve gerektiği gibi değiştirin:

define('SITE_URL', 'http://foo.bar.com:8080/');

Hatırladığım kadarıyla, böyle bir şey yapmak istiyorum:

$protocol = 'http';

if ( (!empty($_SERVER['HTTPS'])) || ($_SERVER['HTTPS'] == 'off') ) {
    $protocol = 'https';
    if ($_SERVER['SERVER_PORT'] != 443)
        $port = $_SERVER['SERVER_PORT'];
} else if ($_SERVER['SERVER_PORT'] != 80) {
    $port = $_SERVER['SERVER_PORT'];
}
// Server name is going to be whatever the virtual host name is set to in your configuration
$address = $protocol . '://' . $_SERVER['SERVER_NAME'];
if (!empty($port))
    $address .= ':' . $port
$address .= $_SERVER['REQUEST_URI'];
// Optional, if you want the query string intact
if (!empty($_SERVER['QUERY_STRING']))
    $address .= '?' . $_SERVER['QUERY_STRING'];

Ben şu anda PHP kullanışlı yok çünkü ben bu kodu test değil.

$ _SERVER ["HTTP_HOST"] elbette bazı doğrulama sonra, muhtemelen en iyi yoldur.

Evet, kullanıcı bunu belirtir ve bu yüzden güvenilir olamaz ancak kullanıcı onunla oyun oynarken kolayca algılayabilir.

$ _SERVER ['HTTP_HOST'] geçerli olduğunu doğrulamak için bir fikir DNS bunu doğrulamak için olabilir. Ben hız ciddi sonuçları olmadan bir ya da iki olguda bu yöntemi kullandım ve bir IP adresi verildiyse bu yöntem sessizce başarısız inanıyorum.

http://www.php.net/manual/en/function.gethostbyname.php

Peusudo kodu olabilir:

define('SITEHOME', in_array(gethostbyname($_SERVER['HTTP_HOST']), array(... valid IP's))) 
? $_SERVER['HTTP_HOST']
: 'default_hostname';

why {if you wish the user to continue using http:///host:port/ that they are on do you wish to generate full urls} whan you can use relative urls instead of either

sayfada ki http://xxx:yy/zzz/fff/

ya da kullanmak culd

../graphics/whatever.jpg {to go back one directory from current and get http://xxx:yy/zzz/graphics/whatever.jpg

or /zzz/graphics/whatever.jpg {to goto site root and work up the directories as specified}

Bu ana söz önlemek hem de: port parçasıdır ve şu anda kullanımda birinden bunu miras