Mevcut alan adını al


140

Sitem sunucuda var

http://www.myserver.uk.com

Bunun için iki alanım var,

http://one.com

ve

http://two.com

PHP geçerli etki alanı ile almak istiyorum, ama eğer $_SERVER['HTTP_HOST']o zaman bu bana göstermek

myserver.uk.com

onun yerine:

one.com or two.com

Sunucu adını değil etki alanını nasıl alabilirim?

PHP sürüm 5.2 var.


Yalnızca birincil URl alabilirsiniz. Hangisi bu üçten Birincil?
Kod Casusu

2
İki alan adınızın istekleri sunucunuza nasıl 'yönlendirdiği' tam olarak?
xiaofeng.li

1
@infgeoax muhtemelen bir çerçeve ...
CodeCaster

birincil, myserver.uk.com'dur. geçerli alan adını nasıl alabilirim? Adres one.com ile site açarsam myserver.uk.com yerine one.com almak istiyorum
Tony Evyght 23:12

@TonyEvyght bu nokta infgeoax ve yapmaya çalışıyorum, bağlandığınız ana bilgisayar adını almalısınız$_SERVER['HTTP_HOST'] . Siteler one.comve two.com(i) bir çerçeve kullanarak "yönlendirme" yapıyorsa, sayfanın kendisi hala myserver.uk.com adresinden gelir, bu nedenle gerçek etki alanını alamazsınız. HTML kaynağı ne için one.com?
CodeCaster

Yanıtlar:


175

Bunu kullanmayı deneyin: $_SERVER['SERVER_NAME']

Veya ayrıştırın

$_SERVER['REQUEST_URI']

apache_request_headers ()


23
-1: Sadece bu cevapla, baktığım farklı önerilerin ne yaptığını tam olarak bilmiyorum. Tabii, bu bana bakmaya devam etmem için bir nokta veriyor, ama kendi başına bu gerçekten iyi bir cevap değil ...
Jasper

4
sadece print_r (apache_request_headers ()) ve hepsini anlayacaksınız :)
onehalf

2
@SarahLewis HTTP_X_ORIGINAL_HOSTkullanıcı tarafından değiştirilebilir ve güvenilemez. Bu her zaman bir sorun olmayabilir, ancak farkında olunması gereken bir şeydir.
wp-overwatch.com

64

En iyi kullanım

echo $_SERVER['HTTP_HOST'];

Ve şu şekilde kullanılabilir:

if (strpos($_SERVER['HTTP_HOST'], 'banana.com') !== false) {
    echo "Yes this is indeed the banana.com domain";
}

Aşağıdaki kod, $ _SERVER içindeki tüm değişkenleri, yürütme işleminden hemen sonra duran anahtar kelimeleriniz vurgulanmış olarak yapılandırılmış bir HTML çıktısında görmenin iyi bir yoludur. Bazen hangisini kendimi kullanacağımı unuttuğum için - bence bu şık olabilir.

<?php
    // Change banana.com to the domain you were looking for..
    $wordToHighlight = "banana.com";
    $serverVarHighlighted = str_replace( $wordToHighlight, '<span style=\'background-color:#883399; color: #FFFFFF;\'>'. $wordToHighlight .'</span>',  $_SERVER );
    echo "<pre>";
    print_r($serverVarHighlighted);
    echo "</pre>";
    exit();
?>

39

Kullanarak $_SERVER['HTTP_HOST']beni (alt alan adı) maindomain.extension alır. Benim için en kolay çözüm gibi görünüyor.

Aslında bir iFrame aracılığıyla 'yeniden yönlendiriyorsanız' , etki alanını belirten bir GET parametresi ekleyebilirsiniz .

<iframe src="myserver.uk.com?domain=one.com"/>

Ardından, uygulamanız boyunca bu verilere devam eden bir oturum değişkeni ayarlayabilirsiniz.


1
daha da önemlisi port numarasını içerir, böylece daha sonra bitirmem gerekmez. bsdnoobz tarafından önerilen phpinfo doğru çözümü bulmama yardımcı oluyor.

30

Bunu yapmanın tek güvenli yolu

Bu sayfadaki diğer tüm yanıtların bilmeniz gereken güvenlik etkileri vardır.

Geçerli etki alanını almanın tek garantili güvenli yöntemi etmektir 𝓪 𝓼𝓮𝓬𝓾𝓻𝓮 𝓵𝓸𝓬𝓪𝓽𝓲𝓸𝓷 𝔂𝓸𝓾𝓻𝓼𝓮𝓵𝓯 𝓲𝓷 𝓲𝓽 𝓼𝓽𝓸𝓻𝓮.

Çoğu çerçeve etki alanını sizin yerinize saklamaya özen gösterir, bu nedenle kendi çerçevenize ait belgelere başvurmak istersiniz. Bir çerçeve kullanmıyorsanız alan adını aşağıdaki yerlerden birinde depolamayı düşünün:

+ ------------------------------------------------- --- + ----------------------------------- +
 | Etki alanını saklama yöntemleri | Tarafından Kullanılan |
+ ------------------------------------------------- --- + ----------------------------------- +
 | Bir yapılandırma dosyası | Joomla, Drupal / Symfony |
 | Veritabanı | WordPress |
 | Çevresel bir değişken | Laravel |
 | Hizmet kaydı | Kubernetes DNS |
+ ------------------------------------------------- --- + ----------------------------------- +


Aşağıdakileri kullanabilirsiniz ... ama güvensizler

Bilgisayar korsanları bu değişkenleri istedikleri etki alanının çıktısını alabilir. Bu, önbellek zehirlenmesine ve zar zor fark edilebilir kimlik avı saldırılarına yol açabilir.

$_SERVER['HTTP_HOST']

Bu, etki alanını bilgisayar korsanları tarafından manipülasyona açık olan istek başlıklarından alır . İle aynı:

$_SERVER['SERVER_NAME']

Apache ayarı usecanonicalname kapalı ise bu daha iyi yapılabilir ; bu durumda $_SERVER['SERVER_NAME']artık rastgele değerlerle doldurulmasına izin verilmeyecek ve güvenli olacaktır. Ancak bu varsayılan değildir ve bir kurulum için ortak değildir.


Popüler sistemlerde

Aşağıdaki etki alanını aşağıdaki çerçevelerde / sistemlerde nasıl edinebileceğiniz aşağıda açıklanmıştır:

WordPress

$urlparts = parse_url(home_url());
$domain = $urlparts['host'];

WordPress'de bir URL oluşturuyorsanız, home_url veya site_url veya diğer URL işlevlerinden herhangi birini kullanın .

laravel

request()->getHost()

request()->getHostFonksiyon Symfony'de devralınan ve 2013'ten beri güvenli olmuştur CVE-2013-4752 yamalı.

Drupal

Yükleyici henüz bunu güvenli hale getirmiyor ( sayı # 2404259 ). Ancak Drupal 8'de Drupal kurulumunuzu güvence altına almak için Güvenilir Ana Bilgisayar Ayarlarında takip edebileceğiniz ve bundan sonra aşağıdakilerin kullanılabileceği belgeler vardır:

\Drupal::request()->getHost();

Diğer çerçeveler

Geçerli yanıtı en sevdiğiniz çerçeveye nasıl ekleyeceğinizi dahil etmek için bu yanıtı düzenlemekte serbestsiniz. Bunu yaparken, lütfen ilgili kaynak koduna veya çerçevenin işleri güvenli bir şekilde yaptığını doğrulamama yardımcı olacak başka bir şeye bağlantı ekleyin.




ek

Sömürü örnekleri:

  1. Bir botnet sürekli olarak yanlış ana bilgisayar üstbilgisini kullanarak bir sayfa isterse önbellek zehirlenmesi meydana gelebilir. Sonuçta ortaya çıkan HTML, saldırganların web sitesine, kullanıcılarınızı kimlik avlayabilecekleri bağlantılar içerir. İlk başta kötü niyetli bağlantılar yalnızca bilgisayar korsanına geri gönderilir, ancak bilgisayar korsanı yeterli istekte bulunursa, sayfanın kötü amaçlı sürümü önbelleğinizde diğer kullanıcılara dağıtılacağı yere gelir.

  2. Bağlantıları ana bilgisayar başlığına göre veritabanında depolarsanız kimlik avı saldırısı olabilir. Örneğin, bir kullanıcının mutlak URL'sini bir forumdaki kullanıcının profillerine depoladığınızı varsayalım. Yanlış bir başlık kullanarak, bir hacker profil bağlantısını tıklayan herkesin kimlik avı sitesi göndermesini sağlayabilir.

  3. Parola sıfırlama zehirlenmesi, bir bilgisayar korsanı farklı bir kullanıcı için parola sıfırlama formunu doldururken kötü amaçlı bir ana bilgisayar üstbilgisi kullanırsa oluşabilir. Bu kullanıcı daha sonra bir kimlik avı sitesine yönlendiren bir şifre sıfırlama bağlantısı içeren bir e-posta alır.

  4. İşte daha kötü niyetli bazı örnekler

Ek Uyarılar ve Notlar:

  • Tüm UseCanonicalName kapatılır $_SERVER['SERVER_NAME']aynı başlığa sahip doldurulur $_SERVER['HTTP_HOST']her durumda kullanılan olurdu (artı bağlantı noktası). Bu Apache'nin varsayılan kurulumudur. Siz veya devops bunu açarsa, tamamsınız - ish - ama küçük bir konfigürasyonda küçük bir konfigürasyon gibi görünecek şeyleri korumak için gerçekten ayrı bir ekibe veya gelecekte üç yıla güvenmek istiyor musunuz? -varsayılan değer? Bu her şeyi güvenli hale getirse de, bu düzene güvenmemeye dikkat ediyorum.
  • Ancak Redhat, varsayılan olarak [ kaynak ] usecanonical'i açar .
  • Eğer Serveralias sanal barındıran girişinde kullanılır ve diğer ad alanı istenir, $_SERVER['SERVER_NAME']cari domain döndürmez, ancak sunucuAdı yönergenin değerini döndürecektir.
  • ServerName çözümlenemiyorsa, işletim sisteminin ana bilgisayar adı komutu yerine [kaynak] kullanılır .
  • Ana bilgisayar başlığı dışarıda bırakılırsa, sunucu usecanonical [kaynak] üzerindeymiş gibi davranacaktır .
  • Son olarak, yerel sunucumda bunu kullanmayı denedim ve ana bilgisayar başlığını taklit edemedim. Apache'de bunu ele alan bir güncelleme olup olmadığını veya sadece yanlış bir şey yapıp yapmadığımı bilmiyorum. Ne olursa olsun, bu başlık sanal ana bilgisayarların kullanılmadığı ortamlarda yine de kullanılabilir.

Küçük Rant:

     Bu soru, eldeki güvenlik sorunlarından bahsetmeden yüz binlerce görüş aldı! Bu şekilde olmamalı, ancak Yığın Taşması yanıtı popüler olduğu için güvenli olduğu anlamına gelmez.




1
Home_url ve site_url arasındaki farktan bahsetmek isteyebilirsiniz. wordpress.stackexchange.com/a/50605/13
Volomike

1
Wordpress kullanıcıları için +1. Alt $urlparts['path']dizine yüklenmişse incelemeniz gerekiyorsa iyi, ancak alan adının kök dizinine yüklendiğinde parse_url anahtarının ayarlanmadığını unutmayın . Else $urlparts['path']alt dizini döndürür.
Jonas Lundman

9

Deneyin $_SERVER['SERVER_NAME'].

İpuçları: İşlevi çağıran bir PHP dosyası oluşturun phpinfo()ve "PHP Değişkenleri" bölümüne bakın. Orada hiç düşünmediğimiz bir sürü faydalı değişken var.


her zaman $ _SERVER $ print_r-

3

Bunun tamamen konuyla ilgili olmayabileceğini biliyorum, ancak benim tecrübelerime göre, mevcut URL'nin WWW-ness'ini bir değişkente saklamayı yararlı buluyorum.

Düzenleme: Buna ek olarak, bunun ne olduğunu görmek için lütfen aşağıdaki yorumuma bakın.

Ajax çağrılarının "www" ile veya olmadan gönderilip gönderilmeyeceğini belirlerken bu önemlidir:

$.ajax("url" : "www.site.com/script.php", ...

$.ajax("url" : "site.com/script.php", ...

Bir Ajax çağrısı gönderirken alan adı, tarayıcının adres çubuğundaki adla eşleşmelidir, aksi takdirde konsolda Yakalanmamış SecurityError olur.

Bu sorunu çözmek için bu çözümü buldum:

<?php
    substr($_SERVER['SERVER_NAME'], 0, 3) == "www" ? $WWW = true : $WWW = false;

    if ($WWW) {
        /* We have www.example.com */
    } else {
        /* We have example.com */
    }
?>

Ardından, $ WWW'nin doğru veya yanlış olup olmadığına bağlı olarak uygun Ajax çağrısını çalıştırın.

Bunun önemsiz gelebileceğini biliyorum, ama bu çok yaygın bir sorun.


OP açıkça SERVER_NAME adlı alanı değil, alan adını istedi .
Sebastian G. Marinescu

Doğru, ama bu günlerde www sorunu için de endişelenmelisin.
InfiniteStack

Neden? JS'de içeriye bakabilirsiniz window.location. PHP'de var SERVER_NAME.
Sebastian G. Marinescu

4
SERVER_NAME, adres çubuğuna "site.com" girilse bile "www.site.com" ifadesini döndürür. Kodunuz boyunca SERVER_NAME kullanıyorsanız, kaçınılmaz olarak www / no-www güvenlik sorunuyla karşılaşacaksınız, özellikle Ajax çağrıları söz konusu olduğunda. Ancak sorunuzu cevaplamak için, gelişmiş PHP programlamasında bazen PHP'nin sunucuya HTTP çağrısı yapan kodu dinamik olarak oluşturması gerekir. Hedef URL içermeyen bir sayfada "www" içeriyorsa, bir güvenlik hatası oluşturur.
InfiniteStack

Tamam tamam ... Ben okudum ve haklısın. Yani cevabınız birisi için uygun olabilir. İyi iş :)
Sebastian G. Marinescu

3

Herkes bu parse_urlişlevi kullanıyor , ancak bazen kullanıcı argümeti farklı biçimde geçirebilir.

Bunu düzeltmek için işlevi yarattım. Şuna bir bak:

function fixDomainName($url='')
{
    $strToLower = strtolower(trim($url));
    $httpPregReplace = preg_replace('/^http:\/\//i', '', $strToLower);
    $httpsPregReplace = preg_replace('/^https:\/\//i', '', $httpPregReplace);
    $wwwPregReplace = preg_replace('/^www\./i', '', $httpsPregReplace);
    $explodeToArray = explode('/', $wwwPregReplace);
    $finalDomainName = trim($explodeToArray[0]);
    return $finalDomainName;
}

URL'yi iletmeniz ve alan adını almanız yeterlidir.

Örneğin,

echo fixDomainName('https://stackoverflow.com');

sonuç geri dönecek

stackoverflow.com

Ve bazı durumlarda:

echo fixDomainName('stackoverflow.com/questions/id/slug');

Ve geri dönecek stackoverflow.com.


1
$_SERVER['HTTP_HOST'] 

// alan adını almak için

$protocol=strpos(strtolower($_SERVER['SERVER_PROTOCOL']),'https') === FALSE ? 'http' : 'https';
$domainLink=$protocol.'://'.$_SERVER['HTTP_HOST'];

// protokollü alan adı

$url=$protocol.'://'.$_SERVER['HTTP_HOST'].'?'.$_SERVER['QUERY_STRING'];

// protokol, etki alanı, queryString toplam ** $ _SERVER ['SERVER_NAME'] çoklu alan adı barındırma için güvenilir değil!


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.