簡體   English   中英

HTTP_HOST 的可靠性如何?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM