Nginx は書き換えずに末尾のスラッシュを追加します

Nginx は書き換えずに末尾のスラッシュを追加します

末尾にスラッシュを追加するリダイレクトを作成しようとしています。

location / {
  if($request_uri ~ ^([^.]*[^/])$){
    return 301 https://$host$request_uri/;
  }
}

if でマッチングを行う方法がわかりません。単に / を使用してリダイレクトを作成すると機能しますが、この正規表現が壊れているようです。

アップデート

書き直してみた

location / {
  rewrite ^([^.]*[^/])$ $1/ permanent;
  .....
}

そして

if ($http_x_forwarded_proto != "https") {
  return 301 https://$host$request_uri;
}

正常に動作し、httpsにリダイレクトされます。私もそれを使って正規表現を作成したかったのです

答え1

かなり前に解決しましたが、多くの人がこの質問をチェックしているのを見ているので、私の記憶が正しければ、このコード行はなく、リダイレクトされていました:

port_in_redirect off;

わかっています、問題のポートについては言及していません。答える方法がないのですが、誰かが同じ問題を抱えていたらここに残しておきます。

答え2

質問を正しく理解していれば、301リダイレクトを使用せずに自動的に配信したいということですね。http://example.com/foo/index.htmlリクエストがhttp://example.com/foo末尾のスラッシュなしで?

もしそうなら、この try_files 構成が機能することがわかりました:

try_files $uri $uri/index.html $uri/ =404;
  • 最初のものは$uriURIと完全に一致します
  • 2番目は$uri/index.html、パスの最後の要素がディレクトリ名と一致し、末尾のスラッシュがないindex.htmlを含むディレクトリと一致します。
  • 3番目$uri/はディレクトリと一致します
  • 4 番目は=404、前のパターンのいずれにも一致しない場合に 404 エラー ページを返します。

答え3

これは期待通りに動作するようです:

location / {
    if ($request_uri ~ ^([^.]*[^/])$) {
        return 301 https://$host$request_uri/;
    }
    try_files $uri $uri/ /index.html;
    ....
}

ステートメントにスペースがないため (タイプミスの可能性があります)、発生するはずの構文エラーを除いて、試したものとの違いがわかりませんif。...または、このディレクティブを上書きする他のディレクティブがあることが原因かもしれません。

関連情報