1. ホーム
  2. java

[解決済み] Tomcat: getHeader("Host") vs. getServerName()

2022-02-13 21:04:44

質問

複数のドメインから提供されるTomcatアプリがあります。以前の開発者は、アプリケーションのURLを返すメソッドを構築しました(下記参照)。そのメソッドの中で、彼らはサーバー名 ( request.getServerName() ) を返し、適切に サーバー名 から httpd.conf ファイルを作成します。

しかし、私はそれを望んでいない。 私が欲しいのは、ブラウザがリクエストを送信したホスト名、つまりブラウザがアプリケーションにアクセスしているドメインです。

試しに getHeader("Host") を返しますが、これはまだ サーバー名 で設定した httpd.conf ファイルに記述します。

の代わりに request.getServerName() ブラウザがリクエストを送信したサーバー名を取得するには、何を使用すればよいのでしょうか?

例えば

  • のServerNameは httpd.conf : www.myserver.net
  • ユーザがTomcatアプリにアクセスするのは www.yourserver.net

を返す必要があります。 www.yourserver.net NOT www.myserver.net . その request.getServerName() を返すだけのようです。 www.myserver.net

/**
 * Convenience method to get the application's URL based on request
 * variables.
 * 
 * @param request the current request
 * @return URL to application
 */
public static String getAppURL(HttpServletRequest request) {
    StringBuffer url = new StringBuffer();
    int port = request.getServerPort();
    if (port < 0) {
        port = 80; // Work around java.net.URL bug
    }
    String scheme = request.getScheme();
    url.append(scheme);
    url.append("://");
    url.append(request.getServerName());
    if (("http".equals(scheme) && (port != 80)) || ("https".equals(scheme) && (port != 443))) {
        url.append(':');
        url.append(port);
    }
    url.append(request.getContextPath());
    return url.toString();
}

ありがとうございました。

どのように解決するのですか?

を確保する必要があります。 httpd を渡すと Host ヘッダをTomcatに送信します。最も簡単な方法(もしあなたが mod_proxy_http - とは言いませんでしたが)次のようにするとよいでしょう。

ProxyPreserveHost On