68

すべての URL の終わりに「/」を付けようとしています。

example.com/art

したほうがいい

example.com/art/

私はnginxをウェブサーバーとして使用しています。

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

理解を深めるために、これを確認してください:

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

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

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

すべての 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を設定するにはどうすればよいですか? (私はルールを書き換えるべきだと思いますか?)

4

10 に答える 10

134

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

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

正規表現は次のように解釈されます。「「。」なしですべてのURIを書き換えます。URIの「/」で終わらないもの+「/」」または単に:「URIにピリオドがなく、スラッシュで終わらない場合は、末尾にスラッシュを追加してください」

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

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

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

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

于 2010-10-12T08:11:48.733 に答える
8

nginx の場合:

rewrite ^(.*[^/])$ $1/ permanent;
于 2010-09-25T01:26:39.463 に答える
3

手遅れですが、解決策を共有したいと思います。末尾のスラッシュと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 / {
    ....
    }
}
于 2016-02-01T07:30:31.157 に答える
2
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 ...
}

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

于 2015-07-24T08:59:11.230 に答える
1

Wordpress で anthonysomerset からの書き換えを使用して、リダイレクト ループによる /wp-admin ダッシュボードへのアクセスの問題を実験しました。しかし、私は上記の条件を使用してこの問題を解決します:

if ($request_uri !~ "^/wp-admin")
{
rewrite ^([^.]*[^/])$ $1/ permanent;
rewrite ^([^.]*)$ /index.php;
}
于 2014-03-12T01:27:56.107 に答える
-4

これを試して:^(.*)$ http://domain.com/$1/ [L,R=301]

これにより、(ステータス コード 301) "/" のないすべて ($1) が "$1/" にリダイレクトされます。

于 2009-03-14T12:48:01.087 に答える