Dapatkan domain saat ini

140

Saya memiliki situs saya di server

http://www.myserver.uk.com

Untuk ini saya punya dua domain,

http://one.com

dan

http://two.com

Saya ingin dapatkan dengan domain PHP saat ini, tetapi jika saya gunakan $_SERVER['HTTP_HOST']maka ini menunjukkan kepada saya

myserver.uk.com

dari pada:

one.com or two.com

Bagaimana saya bisa mendapatkan domain, bukan nama server?

Saya punya PHP versi 5.2.

Tony Evyght
sumber
Anda hanya bisa mendapatkan URl primer. Yang mana yang Pratama dari ketiganya?
Code Spy
2
Persisnya bagaimana dua domain Anda 'mengarahkan' permintaan ke server Anda?
xiaofeng.li
1
@infgeoax mungkin bingkai ...
CodeCaster
primer adalah myserver.uk.com. jadi bagaimana saya bisa mendapatkan nama domain saat ini? Jika saya membuka situs dengan alamat one.com, saya ingin mendapatkan one.com alih-alih myserver.uk.com
Tony Evyght
@ TonyEvyght itu intinya infgeoax dan saya coba buat, Anda harus mendapatkan nama host yang terhubung dengan Anda $_SERVER['HTTP_HOST']. Jika situs one.comdan two.com"mengarahkan" menggunakan bingkai (i), halaman itu sendiri masih berasal dari myserver.uk.com, sehingga Anda tidak akan mendapatkan domain yang sebenarnya. Untuk apa sumber HTML one.com?
CodeCaster

Jawaban:

175

Coba gunakan ini: $_SERVER['SERVER_NAME']

Atau parse

$_SERVER['REQUEST_URI']

apache_request_headers ()

setengah
sumber
23
-1: Dengan jawaban ini saja, saya tidak tahu persis apa perbedaan saran yang saya lihat lakukan. Tentu, ini memberi saya poin untuk terus mencari, tetapi dengan sendirinya ini bukan jawaban yang bagus ...
Jasper
4
cukup print_r (apache_request_headers ()) dan Anda akan mengerti semua :)
onehalf
2
@SarahLewis HTTP_X_ORIGINAL_HOSTdapat dimodifikasi oleh pengguna, dan tidak dapat dipercaya. Ini mungkin tidak selalu menjadi masalah, tapi itu sesuatu yang harus diperhatikan.
wp-overwatch.com
64

Penggunaan terbaik adalah

echo $_SERVER['HTTP_HOST'];

Dan itu bisa digunakan seperti ini:

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

Kode di bawah ini adalah cara yang baik untuk melihat semua variabel dalam $ _SERVER dalam output HTML terstruktur dengan kata kunci yang disorot yang berhenti langsung setelah eksekusi. Karena saya kadang-kadang lupa mana yang akan digunakan sendiri - saya pikir ini bisa bagus.

<?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();
?>
K. Kilian Lindberg
sumber
39

Menggunakan $_SERVER['HTTP_HOST']get me (subdomain.) Maindomain.extension. Sepertinya ini solusi termudah bagi saya.

Jika Anda benar-benar 'mengarahkan ulang' melalui iFrame, Anda dapat menambahkan parameter GET yang menyatakan domain.

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

Dan kemudian Anda bisa mengatur variabel sesi yang tetap data ini di seluruh aplikasi Anda.

Raz0rwire
sumber
1
sebagian besar penting itu termasuk nomor port sehingga saya tidak perlu menyelesaikannya setelah itu. phpinfo yang disarankan oleh bsdnoobz membantu saya menemukan solusi yang tepat.
30

Satu-satunya cara aman untuk melakukan ini

Semua jawaban lain di halaman ini memiliki implikasi keamanan yang perlu Anda perhatikan.

Satu-satunya metode yang dijamin aman untuk mengambil domain saat ini adalah untuk ๐“ผ๐“ฝ๐“ธ๐“ป๐“ฎ ๐“ฒ๐“ฝ ๐“ฒ๐“ท ๐“ช ๐“ผ๐“ฎ๐“ฌ๐“พ๐“ป๐“ฎ ๐“ต๐“ธ๐“ฌ๐“ช๐“ฝ๐“ฒ๐“ธ๐“ท ๐”‚๐“ธ๐“พ๐“ป๐“ผ๐“ฎ๐“ต๐“ฏ.

Sebagian besar kerangka kerja menyimpan domain untuk Anda, jadi Anda ingin berkonsultasi dengan dokumentasi untuk kerangka kerja khusus Anda. Jika Anda tidak menggunakan kerangka kerja, pertimbangkan untuk menyimpan domain di salah satu tempat berikut:

+ ------------------------------------------------- --- + ----------------------------------- +
โ€‰| Metode aman menyimpan domain | Digunakan Oleh |
+ ------------------------------------------------- --- + ----------------------------------- +
โ€‰| File konfigurasi | Joomla, Drupal / Symfony |
โ€‰| Basis data | WordPress |
โ€‰| Variabel lingkungan | Laravel |
โ€‰| Registri layanan | DNS Kubernetes |
+ ------------------------------------------------- --- + ----------------------------------- +


Anda dapat menggunakan yang berikut ... tetapi tidak aman

Peretas dapat membuat variabel-variabel ini menghasilkan domain apa pun yang mereka inginkan. Hal ini dapat menyebabkan keracunan cache dan serangan phishing yang hampir tidak terlihat.

$_SERVER['HTTP_HOST']

Ini mendapatkan domain dari header permintaan yang terbuka untuk dimanipulasi oleh peretas . Sama dengan:

$_SERVER['SERVER_NAME']

Yang ini dapat dibuat lebih baik jika pengaturan Apache usecanonicalname dimatikan; dalam hal $_SERVER['SERVER_NAME']ini tidak akan lagi diizinkan untuk diisi dengan nilai-nilai sewenang-wenang dan akan aman. Ini, bagaimanapun, non-default dan tidak umum dari pengaturan.


Dalam sistem yang populer

Di bawah ini adalah bagaimana Anda bisa mendapatkan domain saat ini dalam kerangka / sistem berikut:

WordPress

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

Jika Anda membuat URL di WordPress, cukup gunakan home_url atau site_url , atau fungsi URL lainnya .

Laravel

request()->getHost()

The request()->getHostFungsi diwariskan dari Symfony, dan telah aman sejak 2013 CVE-2013-4752 ditambal.

Drupal

Pemasang belum mengurus untuk membuat ini aman ( masalah # 2404259 ). Tetapi dalam Drupal 8 ada dokumentasi yang dapat Anda ikuti di Pengaturan Host Tepercaya untuk mengamankan instalasi Drupal Anda setelah itu yang berikut ini dapat digunakan:

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

Kerangka kerja lainnya

Jangan ragu untuk mengedit jawaban ini untuk memasukkan cara mendapatkan domain saat ini dalam kerangka favorit Anda. Saat melakukannya, harap sertakan tautan ke kode sumber yang relevan atau ke hal lain yang akan membantu saya memverifikasi bahwa kerangka kerja melakukan hal-hal dengan aman.




Tambahan

Contoh-contoh eksploitasi:

  1. Keracunan cache dapat terjadi jika botnet terus menerus meminta halaman menggunakan header host yang salah. HTML yang dihasilkan kemudian akan menyertakan tautan ke situs web penyerang di mana mereka dapat menipu pengguna Anda. Pada awalnya tautan jahat hanya akan dikirim kembali ke peretas, tetapi jika peretas melakukan cukup banyak permintaan, versi jahat laman tersebut akan berakhir di cache Anda dan dibagikan ke pengguna lain.

  2. Serangan phishing dapat terjadi jika Anda menyimpan tautan di basis data berdasarkan header host. Misalnya, Anda menyimpan URL absolut ke profil pengguna di forum. Dengan menggunakan tajuk yang salah, seorang peretas dapat membuat siapa saja yang mengklik tautan profil mereka untuk dikirim ke situs phishing.

  3. Keracunan reset kata sandi dapat terjadi jika seorang hacker menggunakan header host jahat ketika mengisi formulir pengaturan ulang kata sandi untuk pengguna yang berbeda. Pengguna itu kemudian akan mendapatkan email yang berisi tautan setel ulang kata sandi yang mengarah ke situs phishing.

  4. Berikut beberapa contoh berbahaya lainnya

Peringatan dan Catatan Tambahan:

  • Ketika usecanonicalname dimatikan, $_SERVER['SERVER_NAME']diisi dengan header yang sama $_SERVER['HTTP_HOST']akan menggunakan anyways (plus port). Ini adalah pengaturan default Apache. Jika Anda atau devops menyalakan ini maka Anda baik-baik saja - ish - tetapi apakah Anda benar-benar ingin bergantung pada tim yang terpisah, atau diri Anda sendiri tiga tahun di masa depan, untuk menjaga apa yang tampaknya menjadi konfigurasi kecil di non -nilai kerusakan? Meskipun ini membuat semuanya aman, saya akan berhati-hati agar tidak bergantung pada pengaturan ini.
  • Redhat, bagaimanapun, tidak mengaktifkan usecanonical secara default [ sumber ].
  • Jika serverAlias digunakan dalam entri host virtual, dan domain alias diminta, $_SERVER['SERVER_NAME']tidak akan mengembalikan domain saat ini, tetapi akan mengembalikan nilai direktif serverName.
  • Jika nama server tidak dapat diatasi, perintah hostname sistem operasi digunakan di tempatnya [sumber] .
  • Jika header host tidak disertakan, server akan berperilaku seolah-olah usecanonical berada di [sumber] .
  • Terakhir, saya hanya mencoba mengeksploitasi ini di server lokal saya, dan tidak dapat menipu header host. Saya tidak yakin apakah ada pembaruan ke Apache yang membahas hal ini, atau apakah saya hanya melakukan sesuatu yang salah. Apapun itu, tajuk ini masih bisa dieksploitasi di lingkungan di mana virtual host tidak digunakan.

Kata-kata kasar kecil:

ย ย ย ย ย Pertanyaan ini menerima ratusan ribu tampilan tanpa satu pun menyebutkan masalah keamanan yang ada! Seharusnya tidak seperti ini, tetapi hanya karena jawaban Stack Overflow populer, itu tidak berarti aman.



wp-overwatch.com
sumber
1
Anda mungkin ingin menyebutkan perbedaan antara home_url dan site_url. wordpress.stackexchange.com/a/50605/13
Volomike
1
+1 untuk pengguna wordpress. Bagus jika Anda perlu memeriksa apakah diinstal dalam subdir, tetapi perhatikan bahwa kunci parse_url: $urlparts['path']tidak disetel jika dipasang di direktori root domain. Lain $urlparts['path']mengembalikan subdirektori.
Jonas Lundman
9

Coba $_SERVER['SERVER_NAME'].

Tips: Buat file PHP yang memanggil fungsi phpinfo()dan lihat bagian "Variabel PHP". Ada banyak variabel berguna yang tidak pernah kita pikirkan di sana.

mengalir bebas
sumber
Anda selalu dapat mencoba print_r-the $ _SERVER dan cari
3

Saya tahu ini mungkin tidak sepenuhnya pada subjek, tetapi dalam pengalaman saya, saya menemukan menyimpan WWW-ness URL saat ini dalam variabel yang bermanfaat.

Sunting: Selain itu, silakan lihat komentar saya di bawah ini, untuk melihat apa maksudnya.

Ini penting ketika menentukan apakah akan mengirim panggilan Ajax dengan "www", atau tanpa:

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

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

Saat mengirim panggilan Ajax nama domain harus cocok dengan yang ada di bilah alamat browser, jika tidak, Anda akan memiliki Uncaught SecurityError di konsol.

Jadi saya datang dengan solusi ini untuk mengatasi masalah ini:

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

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

Kemudian, berdasarkan apakah $ WWW benar, atau salah jalankan panggilan Ajax yang tepat.

Saya tahu ini mungkin terdengar sepele, tetapi ini adalah masalah umum yang mudah tersandung.

InfiniteStack
sumber
OP secara eksplisit meminta domain, dan bukan SERVER_NAME .
Sebastian G. Marinescu
Benar, tetapi hari ini Anda harus khawatir tentang masalah www juga.
InfiniteStack
Mengapa? Di JS Anda bisa melihat window.location. Di PHP Anda dapatkan SERVER_NAME.
Sebastian G. Marinescu
4
SERVER_NAME mengembalikan "www.site.com" bahkan ketika "site.com" dimasukkan ke bilah alamat. Jika Anda menggunakan SERVER_NAME di seluruh kode Anda, mau tidak mau Anda akan mengalami masalah keamanan www / no-www, terutama saat melakukan panggilan Ajax. Tetapi untuk menjawab pertanyaan Anda, dalam pemrograman PHP lanjutan, terkadang PHP perlu secara dinamis menghasilkan kode yang melakukan panggilan HTTP ke server. Jika URL target berisi "www" pada halaman yang tidak, itu akan menghasilkan kesalahan keamanan.
InfiniteStack
Ok ok ... saya membacanya dan Anda benar. Jadi jawaban Anda mungkin relevan untuk seseorang. Kerja bagus :)
Sebastian G. Marinescu
3

Semua orang menggunakan parse_urlfungsi ini, tetapi kadang-kadang pengguna dapat memberikan argumen dalam format yang berbeda.

Jadi untuk memperbaikinya, saya telah membuat fungsinya. Lihat ini:

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;
}

Cukup lewat URL dan dapatkan domainnya.

Sebagai contoh,

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

akan mengembalikan hasilnya

stackoverflow.com

Dan dalam beberapa situasi:

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

Dan itu juga akan kembali stackoverflow.com.

Manojkiran.A
sumber
1
$_SERVER['HTTP_HOST'] 

// untuk mendapatkan domain

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

// domain dengan protokol

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

// protokol, domain, total kueriString ** Karena $ _SERVER ['SERVER_NAME'] tidak dapat diandalkan untuk hosting multi domain!

Sarkar
sumber
-2

Coba saja:

echo apache_request_headers()[3];
Gerakan
sumber