web-dev-qa-db-ja.com

Nginxルールに応答ヘッダーが存在するかどうかを確認するにはどうすればよいですか?

requestの書き換えルールの設定は、Nginxでは非常に簡単であることが証明されました。 responseについては、それほど多くはありません(少なくとも、私にとってはそうではありません)。応答のContent-Lengthヘッダーが設定されていない場合、応答からContent-Typeヘッダーを削除したいのですが。 NginxHttpHeadersMoreModule がインストールされているので、ヘッダーを削除できますが、ルールを使用して応答のContent-Lengthヘッダーの存在を確認する方法が見つからないようです。 Nginxの構成で。これを行う方法についての提案は大歓迎です!

3
Victor Welling

誰かがStackOverflowでこれを尋ねたようで、送信されたヘッダーごとに$ sent_http_my_custom_headerという変数があります。

詳細は https://web.archive.org/web/20140606142058/http://wiki.nginx.org/HttpCoreModule#.24sent_http_HEADER を参照してください。

参照: https://stackoverflow.com/questions/12431496/nginx-read-custom-header-from-upstream-server

1
Dave

locationブロックに次のようなものが必要だと思います。

if ($sent_http_content_length ~ '') {
    more_clear_headers Content-Type
    ...
}

$ sent_http_name を参照してください

(免責事項:私はこれを試したことがありません。質問が面白かったので、ドキュメントを調べました。これは機能する場合と機能しない場合があります)

2
nickgrim

変数があります$content_lengthdocumentation によるとrequestの行Content-Lengthヘッダーに等しい。あなたはおそらくすることができます

if ($content_length = 0) {
    do stuff with header
}

$ content_lengthがどのような値をとるか、またはヘッダーが存在しない場合にその値が存在するかどうかはわかりませんが、ソリューションの開始点として使用できます。

0
coredump

何かが存在しないことをよくチェックすることは常に問題です...しかし....

私は通常、nginxがリッスンしているポートにtelnetで接続し、手作りのhttp応答を作成します。

telnet www.stackoverflow.com 80
Trying 69.59.196.211...
Connected to stackoverflow.com.
Escape character is '^]'.
GET /index.html HTTP/1.1
Host: www.stackoverflow.com

HTTP/1.1 301 Moved Permanently
Server: nginx
Date: Fri, 30 Jul 2010 14:31:02 GMT
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
Location: http://stackoverflow.com/index.html
Content-Length: 158

<head><title>Document Moved</title></head>
<body><h1>Object Moved</h1>This document may be found <a HREF="http://stackoverflow.com/index.html">here</a></body>

ダンプヘッダーオプションを使用して、curlまたはwgetを実行することもできます。たとえば、wgetは以下をサポートします。

   -S
   --server-response
       Print the headers sent by HTTP servers and responses sent by FTP
       servers.

最後に、 カスタムロギング を使用すると、特定の応答ヘッダーを追加できます。次に例を示します。

log_format up_head '$remote_addr - $remote_user [$time_local]  $request '
  'upstream_http_content_type $upstream_http_content_type';
0
Kyle Brandt