6

私がやろうとしているのは、すべてのリクエストをPHP 経由ではなく、Web サーバー経由/rdr/extern_urlでリダイレクトするようにルーティングすることです。extern_url

location /rdr {
    rewrite ^/rdr/(.*)$ $1 permanent;
}

ここで間違っているのはhttp://localhost/rdr/http://google.com、ブラウザにアクセスすると、次のように表示されることです。

Error 310 (net::ERR_TOO_MANY_REDIRECTS): There were too many redirects.

適切にリダイレクトするにはどうすればよいですか?

4

1 に答える 1

7

些細なチェック:

$ curl -si 'http://localhost/rdr/http://www.google.com' | head -8
HTTP/1.1 301 Moved Permanently
Server: nginx/1.2.0
Date: Sun, 05 Aug 2012 09:33:14 GMT
Content-Type: text/html
Content-Length: 184
Connection: keep-alive
Location: http:/www.google.com

ご覧のとおり、 のスキームの後にスラッシュが 1 つだけありますLocation

次のディレクティブを に追加した後server:

merge_slashes off;

正しい応答が得られます。

$ curl -si 'http://localhost/rdr/http://www.google.com' | head -8
HTTP/1.1 301 Moved Permanently
Server: nginx/1.2.0
Date: Sun, 05 Aug 2012 09:36:56 GMT
Content-Type: text/html
Content-Length: 184
Connection: keep-alive
Location: http://www.google.com

スキーマなしでホスト名をリダイレクト サービスに渡したい場合があることは、コメントから明らかです。この問題を解決するには、2 つの場所を定義して、両方のケースを別々に処理する必要があります。

server {
  listen 80;
  server_name localhost;
  merge_slashes off;

  location /rdr {
    location /rdr/http:// {
      rewrite ^/rdr/(.*)$ $1 permanent;
    }
    rewrite ^/rdr/(.*)$ http://$1 permanent;
  }
}

/rdr/http://ここでは、リダイレクタ サービスを 1 つのブロックに保持するためだけにのサブロケーションとして定義しました。-レベル/rdrで両方のロケーションを作成することは完全に有効です。server

于 2012-08-05T09:37:48.793 に答える