些細なチェック:
$ 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