web-dev-qa-db-ja.com

すべてのURLの最後にスラッシュを追加します(nginxの書き換えルールが必要です)

私はすべてのURLの終わりに「/」を取得しようとします:

example.com/art

すべき

example.com/art/

Webサーバーとしてnginxを使用します。

これには書き換えルールが必要です。

よりよく理解するには、これを確認してください:

http://3much.schnickschnack.info/art/projekte

大きな画像の下にある小さなサムネイルを押すと、リロードされ、このURLが表示されます。

http://3much.schnickschnack.info/art/projekte/#

すべてのURLに(最後に)スラッシュがある場合、サイトをリロードしなくても機能します。

現在、nginx-http.confにこの設定があります:

server {
  listen *:80;
  server_name 3much.schnickschnack.info;
  access_log /data/plone/deamon/var/log/main-plone-access.log;
  rewrite ^/(.*)$ /VirtualHostBase/http/3much.schnickschnack.info:80/2much/VirtualHostRoot/$1 last;
  location / {
    proxy_pass http://cache;
  }
}

スラッシュを追加するためにnginxを設定するにはどうすればよいですか? (ルールを書き換える必要があると思いますか?)

48
Gomez

おそらく、あなたはこのようなものが欲しいと思うでしょう:

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

正規表現は、「「。」なしですべてのURIを書き換えます。 URIの最後に「/」が付いていないもの、または「/」で終わるか、単に「URIにピリオドがなく、スラッシュで終わっていない場合は、最後にスラッシュを追加します」

URIをドットなしで書き換える理由は、ファイル拡張子を持つファイルが書き換えられないようにするためです。たとえば、画像、CSS、javascriptなど、独自の書き換えも行うPHPフレームワークを使用している場合、リダイレクトループの可能性を防ぎます

これに伴う一般的な書き直しは次のとおりです。

rewrite ^([^.]*)$ /index.php;

これは、ピリオドを含まないすべてのURIをindex.php(またはコントローラーを実行するファイル)に非常に単純に書き換えます。

100
Bob Monteverde
rewrite ^([^.\?]*[^/])$ $1/ permanent;

残りのURLのクエリ文字列が/でタグ付けされるのを避けるため。

例えば.

/ myrest/do?d = 12345

24
Marc

Nginxの場合:

rewrite ^(.*[^/])$ $1/ permanent;
8
bryan

奇妙なことに、これはGoogleでの最初の結果ですが、満足のいく答えはありません。私が知っているこれを行うには2つの良い方法があります。 1つ目は、要求がファイルにヒットするかどうかを直接チェックし、そうでない場合にのみ書き換え条件を適用することです。例えば。

server {
   # ...
   if (!-f $request_filename) {
     rewrite [^/]$ $uri/ permanent;
   }
   location / {
      # CMS logic, e.g. try_files $uri $uri /index.php$request_uri;
   }
   # ...
}

2番目は、多くの人がifの使用を避けたいので、100%必要ではないので、try_filesを使用して、ヒットしないときに名前付きロケーションブロックにリクエストを送信することです。ファイル。例えば。

server {
   # ...
   location / {
      try_files $uri $uri/ @cms;
   }
   location @cms {
      rewrite [^/]$ $uri/ permanent;
      # CMS logic, e.g. rewrite ^ /index.php$request_uri;
   }
   # ...
}
2
Andrew Dinmore
server {
    # ... omissis ...

    # put this before your locations
    rewrite ^(/.*[^/])$ $1/ permanent;

    # ... omissis ...
}

何らかの種類のリクエスト(たとえばGETリクエスト以外)がこれを行うのを防ぎたい場合(通常はPOSTリクエストについてです。rewriteはリクエストメソッドをGETは、サイトの動的機能の一部を破壊する可能性があります)、if句を追加します。

server {
    # ... omissis ...

    # put this before your locations
    if ($request_method = "GET" ) {
        rewrite ^(/.*[^/])$ $1/ permanent;
    }

    # ... omissis ...
}

rewritelocationブロックに入れて(ifも)、より具体的にすることもできます。

1

wordpressでanthonysomersetからの書き換えを使用して、再循環ループのために/ wp-adminダッシュボードにアクセスする問題を実験しました。しかし、上記の条件を使用してこの問題を解決します:

if ($request_uri !~ "^/wp-admin")
{
rewrite ^([^.]*[^/])$ $1/ permanent;
rewrite ^([^.]*)$ /index.php;
}
1
Ernesto Gámez

遅すぎますが、ソリューションを共有したいので、末尾のスラッシュとnginxの問題に遭遇しました。

#case : 
# 1. abc.com/xyz  => abc.com/xyz/
# 2. abc.com/xyz/ => abc.com/xyz/
# 3. abc.com/xyz?123&how=towork => abc.com/xyz/?123&how=towork
# 4. abc.com/xyz/?123&ho=towork => abc.com/xyz/?123&how=towork

これが私の解決策です

server { 
    ....
    # check if request isn't static file
    if ($request_filename !~* .(gif|html|jpe?g|png|json|ico|js|css|flv|swf|pdf|xml)$ ) {
       rewrite (^[^?]+[^/?])([^/]*)$ $1/$2 permanent;
    }
    ....
    location / {
    ....
    }
}
0
Kai

Httpsでプロキシの背後にあるnginxの場合、このスニペットは$schemeの正しいリダイレクトを行います

map $http_x_forwarded_proto $upstream_scheme {
    "https" "https";
    default "http";
}

server {
    ...
    location / {
        rewrite ^([^.\?]*[^/])$ $upstream_scheme://$http_Host$1/ permanent;
    }
    ...
}

そして、アップストリームプロキシで、次のようなX-Forwarded-Protoヘッダーを渡します。

location / {
    proxy_set_header X-Forwarded-Proto $scheme;
    ...
}
0
METAJIJI