[英]php - How reliable is HTTP_HOST, and will it work for search bots?
[英]How reliable is HTTP_HOST?
我編寫了一個 PHP 腳本,我想在同一台服務器上的多個域上使用它(指向同一個腳本)。 我想向腳本添加功能,以便我可以隨時找出腳本正在使用的域。 HTTP_HOST 可用於查找域,但是,我讀到它不可靠,尤其是在舊瀏覽器中。 我的理解是大多數 Apache 服務器使用虛擬主機,無論如何都使用相同的方法,因此如果托管服務提供商沒有問題,我的代碼應該沒有問題。
任何人都可以驗證這一點並消除混亂嗎?
HTTP_HOST
用於 HTTP 1.1 用戶代理在請求期間發送的Host:
標頭。 HTTP 1.0 客戶端不使用它,因此它不會出現。 但是,如今,我認為 HTTP 1.0 客戶端並不多。
編輯:我更正了:HTTP 1.0 請求中不存在 HOST 標頭。 請參閱@Bruno 的回答。 出於安全考慮,將地雷留在原地
我所知道的 HTTP_HOST 的唯一問題是安全問題,而不是兼容性問題。
安全問題源於用戶發送HTTP_HOST
的事實。 如果網絡服務器設置不正確和/或有問題,任意HTTP_HOST
值可能會出現在您的站點/腳本中(參見例如此處的詳細討論)。 您的應用程序需要為此做好准備。
永遠不要信任 HTTP_HOST(例如,在 PHP 腳本中處理它之前為其設置一組允許值是一個好主意):
<?php
$allowed_hosts = array("domain1.com", "domain2.com", "domain3.com");
if (!in_array(strtolower($_SERVER["HTTP_HOST"]), $allowed_hosts))
die ("Unknown host name ". $_SERVER["HTTP_HOST"]);
Pekka 的回答似乎更有趣,但是您似乎想知道哪些瀏覽器支持 http 1.1,哪些不支持。 在谷歌上找到這個: http : //www.1-script.com/forums/Browser-Support-for-HTTP-1-1-article34982--8.htm
來自該線程的注釋:“HTTP 1.0 瀏覽器無法訪問非默認虛擬主機。” 這意味着據我所知,不支持 http 1.1 的瀏覽器無法訪問共享服務器上的任何網站。 共享主機上有很多網站。 通過使用 HTTP_HOST 變量,子域也可能(雖然不確定)以相同的方式“檢測”。
讀完這些后,我真的不認為現在有人使用舊的瀏覽器,他們不可能真正瀏覽網絡:)
這是我在一個類似問題中的回答:
出於其他目的,我自己也在研究這個:
“HTTP/1.0 被代理、一些移動客戶端和 IE 在配置為使用代理時使用。所以 1.0 似乎仍然占整個網絡流量的一個重要百分比。......是的,有很多1.0 客戶端仍然存在。”
來源(2009 年 7 月): http : //groups.google.com/group/erlang-programming/msg/08f6b72d5156ef74
:-(
我個人在我的網站上收到了很多 HTTP/1.0 請求,但缺少 HTTP_HOST :-(
這是我偶然發現的舊帖子,我給出的解決方案是:
我創建了一個 JSON 文件(我的代碼廣泛使用了這些我稱之為令牌的文件)來成為唯一的真實來源,並同時開放供誰知道應用程序/框架中會出現什么新事物的修改:
// accounttoken.json
{
"site": {
"email": "admin@email.com",
"password": "Bty1!",
"firstname": "John",
"secondname": "Doe",
"country": "USA",
"username": "Admin",
"role": "admin",
"protocol": "http://",
"domain": "a9623c7ca853.eu.ngrok.io",
"site_key": "fgRt4%$x!0($DqJi",
"language": "en"
},
"google": {
"client_id": "51965.apps.googleusercontent.com",
"client_secret": "8Kz"
},
"db_mysql": {
"db_port": 3306,
"db_user": "<user>"
},
// more entries here...
}
現在,您所要做的就是在一個文件中查閱您的條目:
// find php executable
cent$ whereis php
php: /usr/bin/php7.0 /usr/bin/php /usr/lib/php /etc/php /usr/include/php ...
// start interactive shell
cent$ /usr/bin/php7.0 -a
php > $json = file_get_contents('accounttoken.json');
php > $json = json_decode($json, true);
php > echo('Your domain is: ' . $json['site']['domain']);
php > echo('The site url is: ' . $json['site']['protocol'] . $json['site']['domain']);
php > quit
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.