28

http://example.com/whatever/index.phpへの 301 リダイレクトを行うために、 のようなリクエストが必要ですhttp://example.com/whatever/

追加してみました:

rewrite ^(.*/)index.php$ $1 permanent;

location / {
    index  index.php;
}

ここでの問題は、この書き換えがルート URL で実行されるため、無限のリダイレクト ループが発生することです。

編集:

一般的な解決策が必要です

http://example.com/ファイルを提供する必要がありますwebroot/index.php

http://example.com/index.php、301リダイレクトする必要がありますhttp://example.com/

http://example.com/a/index.phpに 301 リダイレクトする必要がありますhttp://example.com/a/

http://example.com/a/で index.php スクリプトを提供する必要がありますwebroot/a/index.php

基本的に、アドレスバーに「index.php」を表示したくありません。正規の URL にリダイレクトする必要がある古いバックリンクがあります。

4

4 に答える 4

71

最近 ServerFault で回答した別のソリューションと同様のソリューションを使用した素晴らしい質問ですが、ここでははるかに単純であり、必要なものを正確に知っています。

ここで必要なのは、ユーザーが明示的にリクエストした場合にのみリダイレクトを実行し、ディレクティブで定義されているよう/index.phpに、実際のスクリプトによって最終的に処理される内部リクエストをリダイレクトしないことです。index.phpindex

これは、ループを回避して、まさにそれを行う必要があります。

server {
    index index.php;

    if ($request_uri ~* "^(.*/)index\.php$") {
        return 301 $1;
    }

    location / {

        # ...
    }
}
于 2014-02-16T16:11:37.207 に答える
2

それを試してみてください

location ~ /*/index.php {
    rewrite ^/(.*)/(.*) http://www.votre_domaine.com/$1 permanent;
}
location /index.php {
    return 301 http://www.example.com/;
}
于 2014-02-14T23:51:36.717 に答える
-3

試す

location = /whatever/index.php {
    return 301 $scheme://www.example.com/whatever/;
}

このようにすることのもう 1 つの利点は、nginx が書き換えよりも速く返されることです。

于 2014-02-10T20:38:57.337 に答える