web-dev-qa-db-ja.com

Nginxを使用したApacheスタイルのマルチビュー

実行しているいくつかの非CMSサイトでApache/mod_phpからNginxに切り替えることに興味があります。問題のサイトは完全に静的なHTMLファイルまたは単純なPHPのいずれかですが、共通しているのは、現在Apacheのmod_negotiationを使用して、ファイル拡張子なしでそれらを提供していることです。私は実際のコンテンツネゴシエーションには関心がありません。私はこれを使用しているので、URLでファイル拡張子を使用する必要はありません。

たとえば、/info/contact.phpのファイルには、/info/contactのURLを介してアクセスします。

実際のファイルはその場所にある.phpファイルですが、URLに拡張子を使用していません。これにより、URLが少し短くなり、クリーンになり、本質的に無意味な実装の詳細がユーザーに公開されなくなります。 Apacheでは、これに必要なのは、mod_negotiationを有効にし、サイトのオプションに+ MultiViewsを追加することだけです。 Nginxでは、なんとか書き直しますが、Nginxは初めてなので、その方法がよくわかりません。

これらのサイトは現在、NginxからApacheにプロキシされて正常に動作していますが、Nginx/fastcgiのみで実行してみたいと思います。私が拡張機能を使用している限り、これらはこのように正常に機能するため、fastcgiの側面はうまく機能しています。私の懸念は、これらの拡張機能を削除することだけです。

サブディレクトリの場合、URLではファイル名が常にではないことに注意することが重要です。あれは、

/foo/bar/foo/bar.phpまたは/foo/bar/index.phpを探す必要があります

/foo//foo/index.phpを探す必要があります

Nginxでこれを達成する簡単な方法はありますか、それともApacheへのプロキシに固執する必要がありますか?

4
Kenn

面倒な書き直しは必要ありません。 try_files これには完全に機能します。基本的には1行だけです。

server {
    server_name foo.com;
    root /your/root/path;
    index index.php;

    location /
        try_files $uri.php $uri/ /notfound.html;
    }

    # Your standard PHP location and everything else is still required here.
}
2

または、次を使用することもできます。

try_files $uri $uri/ index.php;

index.phpの前に/がないと、/foo/bar/index.phpが見つからない場合は/foo/bar/somethingelse.phpを検索します。 (ほとんどの人はフォールバックとして/index.phpを持っています。これは通常、wordpressおよび同様のCMSで機能するためです)。

1
KBeezie