13

サーバーに問題が発生しました。次のような動的 Web ページのさまざまなサイトへのインバウンドリンクを 4 つ取得しました。

myurl.com/default/Site%3Fid%3D13

それらは次のようになります。

myurl.com/default/Site?id=13

%3Fそれらは記号のエスケープシーケンスであり、?等号のエスケープシーケンスであることは知ってい%3Dます。しかし、これらのリンクを使用するとエラー 400 が発生します。それについて私は何ができますか?

4 つのリンクは異なるサイトへのリンクであり、時間が経つにつれてそのようなリンクが増えると思います。したがって、1 つの修正ですべてが完璧になります。

4

3 に答える 3

9

まったく同じ質問が、約 1 年前に nginx-ru メーリング リストで実際に尋ねられました。

http://mailman.nginx.org/pipermail/nginx-ru/2013-February/050200.html

Nginx, Inc の従業員/開発者である Валентин Бартенев による最も有益な回答:

http://mailman.nginx.org/pipermail/nginx-ru/2013-February/050209.html

私は、あなたが私たちのことを知っていることを知っていました. 今日、時間の場所は、現在の場所とは異なります。

翻訳:

リクエストがこのような形式で送信された場合、これらは引数ではなく、リクエストされたファイルの名前になります。もう 1 つのことは、文書化されているように、場所の照合が正規化された URI に対して実行されることです。

ここSOの質問からサンプル例に翻訳された彼の提案された解決策は、次のようになります。

location /default/Site? {
    rewrite \?(.*)$ /default/Site?$1? last;
}

location = /default/Site {
    [...]
}
于 2014-01-09T05:34:14.073 に答える
1

次のサンプルは、URL に関係なく、見た目が悪いすべてのリクエスト (リクエストされ?たファイル名に含まれていると定義され、リクエストのようにエンコードされているものとして定義されています%3F) を、見た目があまり良くないものにリダイレクトします。

(他の場所で正しくアドバイスされているように、そもそもこれらの間違った形式のリンクを取得するべきではないことに注意してください。そのため、最後の手段として使用してください — 他の方法で間違った形式のリンクを修正できず、それがわかっている場合にのみ使用してください。そのような要求は有効なエージェントによって試行されます。)

server {
    listen      [::]:80;
    server_name localhost;

    rewrite     ^/([^?]*)\?(.*)$    /$1?$2?     permanent;
    location / {
        return  200 "id is $arg_id\n";
    }
}

301 Moved Permanentlyこれはどのように機能するかの例です — 見た目が間違っているリクエストに遭遇した場合、正しいと思われるレスポンス ヘッダーを持つレスポンスで修正の試みが行われLocation、ブラウザは新しく提供された場所にリクエストを自動的に再発行します:

opti# curl -6v "http://localhost/default/Site%3Fid%3D13"
* About to connect() to localhost port 80 (#0)
*   Trying ::1...
* connected
* Connected to localhost (::1) port 80 (#0)
> GET /default/Site%3Fid%3D13 HTTP/1.1
> User-Agent: curl/7.26.0
> Host: localhost
> Accept: */*
>
< HTTP/1.1 301 Moved Permanently
< Server: nginx/1.4.1
< Date: Wed, 15 Jan 2014 17:09:25 GMT
< Content-Type: text/html
< Content-Length: 184
< Location: http://localhost/default/Site?id=13
< Connection: keep-alive
<
<html>
<head><title>301 Moved Permanently</title></head>
<body bgcolor="white">
<center><h1>301 Moved Permanently</h1></center>
<hr><center>nginx/1.4.1</center>
</body>
</html>
* Connection #0 to host localhost left intact
* Closing connection #0

適切に見えるリクエストに対しては、修正の試行は行われないことに注意してください。

opti# curl -6v "http://localhost/default/Site?id=13"
* About to connect() to localhost port 80 (#0)
*   Trying ::1...
* connected
* Connected to localhost (::1) port 80 (#0)
> GET /default/Site?id=13 HTTP/1.1
> User-Agent: curl/7.26.0
> Host: localhost
> Accept: */*
>
< HTTP/1.1 200 OK
< Server: nginx/1.4.1
< Date: Wed, 15 Jan 2014 17:09:30 GMT
< Content-Type: application/octet-stream
< Content-Length: 9
< Connection: keep-alive
<
id is 13
* Connection #0 to host localhost left intact
* Closing connection #0
于 2014-01-15T17:17:17.657 に答える
0

URLは完全に有効です。含まれているエスケープ文字は、まさにエスケープされたものです。これは完全に問題ありません。

目的は、実際に要求名 (ほとんどの場合、ディスク上のファイル名に対応する) を取得できるようにすることです。Site?id=13それSite以外はクエリ文字列として使用できます。

これを必要とするファイル名に文字を含めることは悪い習慣だと思います。ただし、URL 引数では必要になる場合があります。

それにもかかわらず、リクエスト URL は有効であり、おそらくあなたが望むものではありません。したがって、最初に誰かが間違った URL を取得した場合は、エラーを修正する必要があります。

エラー 400 が発生する理由がよくわかりません。エラー 404 が発生するはずですが、それは設定によって異なります。

また、特に nginx では、ほとんどの場合、URL 全体と URL の一部を複数のレベルで渡す必要があります (たとえば、リバース プロキシ、URL から正規表現を照合し、それらを変数として使用するなど)、このようなエラーが発生する可能性があります。ただし、これを確認して修正するには、セットアップについて詳しく知る必要があります。

于 2014-01-15T16:10:39.010 に答える