3

Apache のバックグラウンドから来て、過去に、一対の書き換えルールを使用して .html ファイル拡張子を隠していました。

RewriteCond %{THE_REQUEST} ^(GET|HEAD)\ /.+\.html\ HTTP
RewriteRule ^(.+)\.html$ http://%{HTTP_HOST}/$1 [R=301,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule ^.+$ %{REQUEST_FILENAME}.html [L]

nginx の書き換え機能は異なりますが、考えられる解決策はここにありますが、nginx wiki では、可能であれば ifs を回避することが最善の解決策であると示唆しており、try_files代わりに ( ) を使用することについて説明しています。次のように、誰かがこのようなものを実装するための最良の方法を持っているかどうか疑問に思っていました:

try_files $uri $uri.html =404;

場合によっては動作しますが、大規模なリダイレクトの問題などが発生する可能性があります。この場合、ifs を回避する方法はありますか?

4

1 に答える 1

1

次のように try_files ディレクティブを使用します。

location / {
  try_files $uri $uri.html =404;
}

これは、ロケーション ブロックに一致する各 uri に対して次のことを行います。

  1. 完全に一致するファイルがあるかどうかを確認し、ある場合はそれを提供します
  2. 完全一致が見つからない場合は、リクエストに .html を追加してみてください
  3. それが見つからない場合は、404 を返します

リダイレクトはまったくなく、nginx がいくつかのオプションを順番にチェックするだけです。

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule ^.+$ %{REQUEST_FILENAME}.html [L]

その最初の 2 行は基本的に 1. と 2. ですが、nginx は URL を書き換える必要がないことを除いて、try_files ディレクティブにより、一致が見つかったときにリクエストを返すだけで十分スマートになります。

于 2012-08-16T20:41:30.213 に答える