0

C# で小さなプロキシ サーバーを作成しようとしています。私がテストした多くの Web ページ (google.com と microsoft.com を含む) でうまく機能しています。テストのために、プロキシ サーバーを起動し、それを使用するように Windows 8 で IE 10 を構成しました。

しかし、wikipedia.org を試してみると、メイン ページのみが読み込まれ、画像は読み込まれません。単一の画像をロードしようとしました ( http://upload.wikimedia.org/wikipedia/commons/6/63/Wikipedia-logo.png )。プロキシなしで IE を使用すると動作しますが、プロキシを使用すると 404 応答が返されます。

これは IE (私のプロキシはそれを転送するだけです) が発行する GET リクエストです:

GET http://upload.wikimedia.org/wikipedia/commons/6/63/Wikipedia-logo.png HTTP/1.1
Accept: text/html, application/xhtml+xml, */*\
Accept-Language: de-CH\
User-Agent: Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0)
Accept-Encoding: gzip, deflate
Host: upload.wikimedia.org
DNT: 1
Proxy-Connection: Keep-Alive

IMHOそれは正しいように見えます。これは私が得る応答です(いくつかのhtmlタグを省略しました):

HTTP/1.1 404 Not Found
Content-Type: text/html; charset=UTF-8
X-Varnish: 1427845074 1427806476, 274786836, 3671934588
Via: 1.1 varnish, 1.1 varnish, 1.1 varnish
Content-Length: 262
Accept-Ranges: bytes
Date: Mon, 01 Jul 2013 21:30:54 GMT
Age: 28
Connection: keep-alive
X-Cache: cp1063 hit (1), cp3004 miss (0), cp3003 frontend miss (0)
Access-Control-Allow-Origin: *

...404 Not Found\n  The resource could not be found.\nRegexp failed to match URI: "http:/upload.wikimedia.org/wikipedia/commons/6/63/Wikipedia-logo.png"

奇妙な部分はここにあります:

Regexp failed to match URI: "http:/upload.wikimedia.org/wikipedia/commons/6/63/Wikipedia-logo.png" 

-> URL は http:/ で始まります

コードでは、次のように uploads.wikimedia.org に接続します。

                // connect to uploads.wikimedia.org
                ServerSocket.Connect(RemoteHost, 80);
                byte[] SendBuffer = Request.ToArray();

                // send the clients request to the server
                ServerSocket.Send(SendBuffer);

なぜうまくいかないのかわかりません。どんな助けでも大歓迎です。私の完全なコードは Github にあります: Proxy_C_Sharp

4

1 に答える 1

1

理由がわかりました。

第 5.2.1 章の HTTP/1.1 仕様 ( http://www.w3.org/Protocols/rfc2616/rfc2616-sec5.html#sec5 ) によると:

「将来のバージョンの HTTP ですべてのリクエストで絶対 URI への移行を可能にするために、HTTP/1.1 クライアントはプロキシへのリクエストでのみ絶対 URI フォームを生成しますが、すべての HTTP/1.1 サーバーはリクエストで絶対 URI フォームを受け入れなければなりません。」

小さい工具で作ってみました。次のようなリクエストを行う場合:

GET /wikipedia/commons/6/63/Wikipedia-logo.png HTTP/1.1
Host: upload.wikimedia.org

できます。その理由は、ウィキペディアが標準に準拠していないためです。絶対 URL を受け入れる必要があります。しかし、ブラウザはプロキシでのみ絶対 URI を使用するため、プロキシなしでサイトにアクセスすると機能します。プロキシが構成されていない場合は、相対プロキシが使用されます。

于 2013-07-02T19:41:00.480 に答える