9

同じサーバー上の複数のドメインで使用したいPHPスクリプトを作成しました(同じスクリプトを指しています)。スクリプトに機能を追加して、スクリプトがどのドメインで動作しているかをいつでも確認できるようにしたい。HTTP_HOSTを使用してドメインを見つけることができますが、特に古いブラウザーでは信頼できないことを読みました。私の理解では、ほとんどのApacheサーバーは、とにかく同じ方法を使用する仮想ホストを使用しているため、ホスティングプロバイダーに問題がなければ、コードに問題はないはずです。

誰かがこれを確認して混乱を解消してください。

4

5 に答える 5

10

HTTP_HOSTHost:リクエスト中にHTTP1.1ユーザーエージェントによって送信されるヘッダー用です。これはHTTP1.0クライアントでは使用されないため、表示されません。しかし、今日では、HTTP1.0クライアントはまだ多くないと思います。

于 2010-11-04T11:38:29.733 に答える
9

編集:私は訂正されました:HOSTヘッダーはHTTP1.0リクエストに存在しません。@Brunoの回答を参照してください。セキュリティ上の理由から鉱山をそのままにしておく

私が知っているHTTP_HOSTの唯一の問題はセキュリティの問題であり、互換性の問題ではありません。

HTTP_HOSTセキュリティの問題は、ユーザーによって送信されたという事実に起因します。Webサーバーが正しく設定されていないか、バグがある場合、任意の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"]);
于 2010-11-04T11:31:32.113 に答える
1

Pekkaの答えはもっと興味深いようですが、どのブラウザがhttp 1.1をサポートし、どのブラウザがサポートしていないかを知りたいようです。Googleでこれを見つけました:http ://www.1-script.com/forums/Browser-Support-for-HTTP-1-1-article34982--8.htm

そのスレッドからのメモ:「HTTP1.0ブラウザはデフォルト以外の仮想ホストに到達できません。」つまり、http 1.1をサポートしていないブラウザは、私が知る限り、共有サーバー上のどのWebサイトにもアクセスできません。共有ホスト上の多くのWebサイトがあります。また、サブドメインは、HTTP_HOST変数を使用して、同じ方法で「検出」される可能性があります(確かではありません)。

これらを読んだ後、私は誰もが最近の古いブラウザを使用しているとは思いません。実際にWebをナビゲートすることは不可能です:)

于 2010-11-04T12:13:35.153 に答える
0

これは私が同様の質問で答えたものです:


他の目的のためにこれを自分で調べます:

「HTTP/1.0は、プロキシ、一部のモバイルクライアント、およびプロキシを使用するように構成されたIEで使用されています。したがって、1.0は、Web全体のトラフィックの重要な割合を占めているようです。...はい、多くあります。 1.0クライアントはまだそこにあります。」

出典(2009年7月):http://groups.google.com/group/erlang-programming/msg/08f6b72d5156ef74

:-(


個人的に、HTTP_HOSTが欠落しているサイトでかなりの数のHTTP/1.0リクエストを受け取っています:-(

于 2010-11-12T18:30:28.777 に答える
0

これは私がつまずいた古い投稿であり、私が与えた解決策はこれです:

私は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...
}

今、あなたがしなければならないのは、1つのファイルであなたのエントリを調べることです:

// 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
于 2020-06-30T08:05:07.713 に答える