Nhận tên miền hiện tại


140

Tôi có trang web của tôi trên máy chủ

http://www.myserver.uk.com

Đối với điều này, tôi có hai tên miền,

http://one.com

http://two.com

Tôi muốn có được tên miền hiện tại PHP, nhưng nếu tôi sử dụng $_SERVER['HTTP_HOST']thì điều này cho tôi thấy

myserver.uk.com

thay vì:

one.com or two.com

Làm thế nào tôi có thể có được tên miền, không phải tên máy chủ?

Tôi có phiên bản PHP 5.2.


Bạn chỉ có thể nhận được URl chính. Cái nào là sơ cấp trong số ba?
Mã gián điệp

2
Chính xác làm thế nào hai yêu cầu 'chuyển hướng' đến máy chủ của bạn?
xiaofeng.li

1
@infgeoax có lẽ là một khung ...
CodeCaster

chính là myserver.uk.com. vậy làm thế nào tôi có thể có được tên miền hiện tại? Nếu tôi mở trang web có địa chỉ one.com, tôi muốn lấy one.com thay vì myserver.uk.com
Tony Evyght

@TonyEvyght đó là infgeoax và tôi cố gắng thực hiện, bạn sẽ nhận được tên máy chủ mà bạn đang kết nối $_SERVER['HTTP_HOST']. Nếu các trang web one.comtwo.comđang "chuyển hướng" bằng cách sử dụng khung (i), thì trang đó vẫn đến từ myserver.uk.com, vì vậy bạn sẽ không nhận được tên miền thực. Nguồn HTML để làm one.comgì?
CodeCaster

Câu trả lời:


175

Hãy thử sử dụng cái này: $_SERVER['SERVER_NAME']

Hoặc phân tích

$_SERVER['REQUEST_URI']

apache_Vquest_headers ()


23
-1: Chỉ với câu trả lời này, tôi không biết chính xác những gợi ý khác nhau mà tôi đang xem là gì. Chắc chắn, điều này cho tôi một điểm để tiếp tục tìm kiếm, nhưng bản thân nó thực sự không phải là một câu trả lời hay ...
Jasper

4
chỉ print_r (apache_request_headers ()) và bạn sẽ hiểu tất cả :)
onehalf

2
@SarahLewis HTTP_X_ORIGINAL_HOSTcó thể được người dùng sửa đổi và không thể tin cậy được. Điều này có thể không phải luôn luôn là một vấn đề, nhưng đó là điều cần lưu ý.
wp-overwatch.com

64

Sử dụng tốt nhất sẽ là

echo $_SERVER['HTTP_HOST'];

Và nó có thể được sử dụng như thế này:

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

Mã dưới đây là một cách tốt để xem tất cả các biến trong $ _SERVER trong đầu ra HTML có cấu trúc với các từ khóa được tô sáng mà dừng trực tiếp sau khi thực hiện. Vì đôi khi tôi quên mất việc sử dụng bản thân mình - tôi nghĩ rằng điều này có thể tiện lợi.

<?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

Sử dụng $_SERVER['HTTP_HOST']được tôi (tên miền phụ.) Maindomain.extension. Có vẻ như là giải pháp dễ nhất với tôi.

Nếu bạn thực sự 'chuyển hướng' thông qua iFrame, bạn có thể thêm tham số GET ghi tên miền.

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

Và sau đó bạn có thể đặt biến phiên duy trì dữ liệu này trong suốt ứng dụng của mình.


1
quan trọng nhất là nó bao gồm số cổng để tôi không cần phải nối nó sau đó. phpinfo được đề xuất bởi bsdnoobz giúp tôi tìm giải pháp phù hợp mặc dù.

30

Cách an toàn duy nhất để làm điều này

Tất cả các câu trả lời khác trên trang này đều có ý nghĩa bảo mật mà bạn cần phải biết.

Phương pháp bảo mật an toàn duy nhất để truy xuất tên miền hiện tại là để 𝓼𝓽𝓸𝓻𝓮 𝓲𝓽.

Hầu hết các khung làm việc lưu trữ tên miền cho bạn, vì vậy bạn sẽ muốn tham khảo tài liệu cho khung cụ thể của mình. Nếu bạn không sử dụng khung, hãy xem xét việc lưu trữ tên miền ở một trong những nơi sau:

+ ------------------------------------------------- --- + ----------------------------------- +
 | Phương pháp lưu trữ an toàn tên miền | Được sử dụng bởi |
+ ------------------------------------------------- --- + ----------------------------------- +
 | Một tập tin cấu hình | Joomla, Drupal / Symfony |
 | Cơ sở dữ liệu | WordPress |
 | Một biến môi trường | Ấu trùng |
 | Đăng ký dịch vụ | Kubernetes DNS |
+ ------------------------------------------------- --- + ----------------------------------- +


Bạn có thể sử dụng những điều sau đây ... nhưng chúng không an toàn

Tin tặc có thể làm cho các biến này xuất ra bất cứ tên miền nào chúng muốn. Điều này có thể dẫn đến ngộ độc bộ nhớ cache và các cuộc tấn công lừa đảo hầu như không đáng chú ý.

$_SERVER['HTTP_HOST']

Điều này nhận được tên miền từ các tiêu đề yêu cầu được mở để thao túng bởi tin tặc . Giống với:

$_SERVER['SERVER_NAME']

Điều này có thể được thực hiện tốt hơn nếu thiết lập Apache usecanonicalname bị tắt; trong trường hợp đó $_SERVER['SERVER_NAME']sẽ không còn được phép cư trú với các giá trị tùy ý và sẽ được bảo mật. Tuy nhiên, đây không phải là mặc định và không phổ biến trong thiết lập.


Trong các hệ thống phổ biến

Dưới đây là cách bạn có thể nhận được tên miền hiện tại trong các khung / hệ thống sau:

WordPress

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

Nếu bạn đang xây dựng một URL trong WordPress, chỉ cần sử dụng home_url hoặc site_url hoặc bất kỳ chức năng URL nào khác .

Ấu trùng

request()->getHost()

Các request()->getHostchức năng được thừa hưởng từ Symfony, và đã được an toàn kể từ năm 2013 CVE-2013-4752 đã được vá.

Drupal

Trình cài đặt chưa quan tâm đến việc bảo mật này ( vấn đề # 2404259 ). Nhưng trong Drupal 8 có tài liệu bạn có thể theo dõi tại Cài đặt máy chủ đáng tin cậy để bảo mật cài đặt Drupal của bạn sau đó có thể sử dụng các mục sau:

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

Các khung khác

Vui lòng chỉnh sửa câu trả lời này để bao gồm cách lấy tên miền hiện tại trong khung yêu thích của bạn. Khi làm như vậy, vui lòng bao gồm một liên kết đến mã nguồn có liên quan hoặc bất kỳ điều gì khác có thể giúp tôi xác minh rằng khung đang thực hiện mọi thứ một cách an toàn.




Phụ lục

Ví dụ khai thác:

  1. Ngộ độc bộ nhớ cache có thể xảy ra nếu botnet liên tục yêu cầu một trang sử dụng tiêu đề máy chủ sai. HTML kết quả sau đó sẽ bao gồm các liên kết đến trang web của kẻ tấn công nơi họ có thể lừa đảo người dùng của bạn. Lúc đầu, các liên kết độc hại sẽ chỉ được gửi lại cho tin tặc, nhưng nếu tin tặc thực hiện đủ yêu cầu, phiên bản độc hại của trang sẽ kết thúc trong bộ đệm của bạn, nơi nó sẽ được phân phối cho người dùng khác.

  2. Một cuộc tấn công lừa đảo có thể xảy ra nếu bạn lưu trữ các liên kết trong cơ sở dữ liệu dựa trên tiêu đề máy chủ. Ví dụ: giả sử bạn lưu trữ URL tuyệt đối vào hồ sơ của người dùng trên diễn đàn. Bằng cách sử dụng tiêu đề sai, tin tặc có thể khiến bất cứ ai nhấp vào liên kết hồ sơ của họ được gửi một trang web lừa đảo.

  3. Ngộ độc đặt lại mật khẩu có thể xảy ra nếu tin tặc sử dụng tiêu đề máy chủ độc hại khi điền vào biểu mẫu đặt lại mật khẩu cho một người dùng khác. Người dùng đó sau đó sẽ nhận được email chứa liên kết đặt lại mật khẩu dẫn đến trang web lừa đảo.

  4. Dưới đây là một số ví dụ độc hại

Hãy cẩn thận và ghi chú:

  • Khi tắt usecanonicalname , $_SERVER['SERVER_NAME']được điền cùng tiêu đề$_SERVER['HTTP_HOST'] sẽ sử dụng mọi cách (cộng với cổng). Đây là thiết lập mặc định của Apache. Nếu bạn hoặc người hâm mộ bật cái này lên thì bạn vẫn ổn - ish - nhưng bạn có thực sự muốn dựa vào một nhóm riêng biệt hay chính bạn trong ba năm tới, để giữ cho cấu hình không phải là cấu hình nhỏ ở mức không -giá trị mặc định? Mặc dù điều này làm cho mọi thứ an toàn, tôi sẽ thận trọng không dựa vào thiết lập này.
  • Tuy nhiên, Redhat không bật usecanonical theo mặc định [ nguồn ].
  • Nếu serverAlias được sử dụng trong mục nhập máy chủ ảo và tên miền bí danh được yêu cầu, $_SERVER['SERVER_NAME']sẽ không trả về tên miền hiện tại, nhưng sẽ trả về giá trị của lệnh serverName.
  • Nếu tên máy chủ không thể được giải quyết, lệnh tên máy chủ của hệ điều hành được sử dụng ở vị trí [nguồn] .
  • Nếu tiêu đề máy chủ bị bỏ qua, máy chủ sẽ hoạt động như thể thông thường là trên [nguồn] .
  • Cuối cùng, tôi chỉ thử khai thác điều này trên máy chủ cục bộ của mình và không thể giả mạo tiêu đề máy chủ. Tôi không chắc có bản cập nhật nào cho Apache giải quyết vấn đề này không, hoặc nếu tôi đang làm gì đó sai. Bất kể, tiêu đề này vẫn có thể khai thác được trong các môi trường không sử dụng máy chủ ảo.

Little Rant:

     Câu hỏi này đã nhận được hàng trăm ngàn lượt xem mà không có một đề cập nào về các vấn đề bảo mật trong tầm tay! Không nên theo cách này, nhưng chỉ vì câu trả lời Stack Overflow là phổ biến, điều đó không có nghĩa là nó an toàn.




1
Bạn có thể muốn đề cập đến sự khác biệt giữa home_url và site_url. wordpress.stackexchange.com/a/50605/13
Volomike

1
+1 cho người dùng wordpress. Tốt nếu bạn cần kiểm tra nếu được cài đặt trong thư mục con, nhưng lưu ý rằng khóa parse_url: $urlparts['path']không được đặt nếu được cài đặt trong thư mục gốc của tên miền. Khác $urlparts['path']trả lại thư mục con.
Jonas Lundman

9

Hãy thử $_SERVER['SERVER_NAME'].

Mẹo: Tạo một tệp PHP gọi hàm phpinfo()và xem phần "Biến PHP". Có một loạt các biến hữu ích mà chúng ta không bao giờ nghĩ đến ở đó.


bạn luôn có thể thử print_r-ing $ _SERVER và tìm kiếm

3

Tôi biết điều này có thể không hoàn toàn về chủ đề này, nhưng theo kinh nghiệm của tôi, tôi thấy việc lưu trữ WWW-ness của URL hiện tại trong một biến hữu ích.

Chỉnh sửa: Ngoài ra, vui lòng xem bình luận của tôi dưới đây, để xem những gì đang diễn ra.

Điều này rất quan trọng khi xác định có nên gửi các cuộc gọi Ajax bằng "www" hay không:

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

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

Khi gửi một cuộc gọi Ajax, tên miền phải khớp với tên trong thanh địa chỉ của trình duyệt, nếu không, bạn sẽ có Uncaught SecurityError trong bảng điều khiển.

Vì vậy, tôi đã đưa ra giải pháp này để giải quyết vấn đề:

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

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

Sau đó, dựa trên việc $ WWW là đúng hay sai chạy cuộc gọi Ajax thích hợp.

Tôi biết điều này nghe có vẻ tầm thường, nhưng đây là một vấn đề phổ biến rất dễ xảy ra.


OP đã hỏi rõ ràng về tên miền chứ không phải SERVER_NAME .
Sebastian G. Marinescu

Đúng, nhưng những ngày này bạn cũng phải lo lắng về vấn đề www.
InfiniteStack

Tại sao? Trong JS bạn có thể nhìn vào window.location. Trong PHP bạn có SERVER_NAME.
Sebastian G. Marinescu

4
SERVER_NAME trả lại "www.site.com" ngay cả khi "site.com" được nhập vào thanh địa chỉ. Nếu bạn đang sử dụng SERVER_NAME trong toàn bộ mã của mình, chắc chắn bạn sẽ gặp phải vấn đề bảo mật www / no-www, đặc biệt là khi thực hiện các cuộc gọi Ajax. Nhưng để trả lời câu hỏi của bạn, trong lập trình PHP nâng cao, đôi khi PHP cần tự động tạo mã để thực hiện cuộc gọi HTTP đến máy chủ. Nếu URL mục tiêu chứa "www" trên một trang không có, nó sẽ tạo ra lỗi bảo mật.
InfiniteStack

Ok ok ... Tôi đã đọc về nó và bạn đã đúng. Vì vậy, câu trả lời của bạn có thể có liên quan cho một ai đó. Làm tốt lắm :)
Sebastian G. Marinescu

3

Mọi người đều đang sử dụng parse_urlchức năng, nhưng đôi khi người dùng có thể vượt qua argumet ở định dạng khác nhau.

Vì vậy, để khắc phục điều đó, tôi đã tạo ra chức năng. Kiểm tra này:

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

Chỉ cần vượt qua URL và nhận được tên miền.

Ví dụ,

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

sẽ trả về kết quả sẽ là

stackoverflow.com

Và trong một số tình huống:

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

Và nó cũng sẽ trở lại stackoverflow.com.


1
$_SERVER['HTTP_HOST'] 

// để lấy tên miền

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

// tên miền với giao thức

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

// giao thức, tên miền, tổng số queryString ** Vì $ _SERVER ['SERVER_NAME'] không đáng tin cậy cho lưu trữ đa miền!


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.