Nginx で URL を変更せずに、ある場所を別の場所にリダイレクトするにはどうすればよいですか?

Nginx で URL を変更せずに、ある場所を別の場所にリダイレクトするにはどうすればよいですか?

私はさまざまな製品を表示するウェブサイトに取り組んでいます。ユーザーは「mydomain.com/product/1.html」、「mydomain.com/product/2.html」などの URL でさまざまな製品ページにアクセスできます。

しかし、私はそれらの静的HTMLファイルを直接表示したくありません。代わりに、mydomain.com/product.phpに最初に読み込まれるPHPスクリプトがあります。

つまり、「mydomain.com/product/1.html」を「mydomain.com/product.php」にリダイレクトしたいのですが、元のURLは変更しません。

alias、try_files、return を試しましたが、すべて URL が 'mydomain.com/product.php' に書き換えられます。

私は Nginx を初めて使用しており、これはおそらく非常に簡単な質問ですが、数日間これを実現しようと試みました。

答え1

やり方はいろいろあります...

最も単純なのは

rewrite ^/product/ /product.php;

サーバコンテキスト。元のリクエスト URI (つまり) は、配列項目の値としてスクリプト/product/1.htmlで使用できます。product.php$_SERVER['REQUEST_URI']

rewriteディレクティブを使用することもできます位置文脈によっては、これは少し(とてもわずかにパフォーマンスが向上しました:

location /product/ {
    rewrite ^ /product.php last;
}

必要に応じて、製品コードを取得し、それをproduct.phpクエリ引数としてスクリプトに渡すことができます。

rewrite ^/product/(.*)\.html$ /product.php?product=$1;

または

location /product/ {
    rewrite ^/product/(.*)\.html$ /product.php?product=$1 last;
}

この方法では、製品コード ( URI1の場合/product/1.html、 URI2の場合など) が配列項目の値としてスクリプト/product/2.htmlで使用できるようになります。product.php$_GET['product']

これには個別の FastCGI ハンドラーを定義することもできます。

location /product/ {
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root/product.php;
    fastcgi_pass <fastcgi_upstream_or_socket>;
}

(元のリクエスト URI は 経由で利用可能になります$_SERVER['REQUEST_URI'])、または製品コードを 経由で利用可能にしたい場合は、次のようになります$_GET['product']:

location ~ /product/(.*)\.html$ {
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root/product.php;
    fastcgi_param QUERY_STRING product=$1;
    fastcgi_pass <fastcgi_upstream_or_socket>;
}

関連情報