web-dev-qa-db-ja.com

Nginxはすべてのリクエストをサブディレクトリから別のサブディレクトリルートにリダイレクトします

私はNginxにかなり慣れていないので、我慢してください。

すべてのリクエストを1つのサブディレクトリ(ストア)から別のサブディレクトリ(トレード)のルートにリダイレクトしようとしています。以下の私の進捗状況を参照してください。ターゲットサブディレクトリ(trade)内のサイトはmagentoサイトであるため、現在のほとんどのルールが対象となっています。

server {
    server_name example.com *.example.com;
    root /usr/share/nginx/html/example.com/public_html;
    index index.php index.html index.htm;

    access_log /var/log/nginx/example.access.log;
    error_log /var/log/nginx/example.error.log;

    location / {
            try_files $uri $uri/ /index.html;
    }

    location /trade/ {
            index index.html index.php;
            try_files $uri $uri/ @handler;
            expires 30d;
    }

    location ~ /store {
            rewrite /trade permanent;
    }

    location ~ ^/trade/(app|includes|lib|media/downloadable|pkginfo|report/config.xml|var)/ { internal; }
    location /trade/var/export/ { internal; }
    location /. { return 404; }
    location @handler { rewrite / /trade/index.php; }

    error_page 404 /404.html;

    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
          root /usr/share/nginx/html;
    }

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    location ~ \.php$ {
            try_files $uri =404;
            fastcgi_pass unix:/var/run/php5-fpm.sock;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include fastcgi_params;

    }


}

リダイレクトに使用しているセクションは次のとおりです。

location ~ /store {
        rewrite /trade permanent;
}

これは、example.com/storeでは機能しますが、example/store/index.phpや、argsを使用するその他のURIでは機能しません。一番下のphpファイルセクションが処理を上書きしている感じがします。ドキュメント here がこれが最初に処理されると述べているので、私はストアの場所の前に〜を置いた理由です。処理は停止または続行しますか?

私はphpルールのネストについて読みましたが、これは役に立たないように試みました。

どんな助けにも感謝します。

11
user1214769

このようなものを試して

location ^~ /store(.*) {
  return 301 $scheme://$http_Host/trade$1$is_args$query_string;
}

ハードコードされたものをできるだけ避けてreturnを使用する 永続的な書き換えよりも優先される

35

OK、

これに戻ると、問題がわかります。

Nginxでは、ロケーションディレクティブの前に〜を付けると、ディレクティブで正規表現を処理することを意味します(大文字と小文字を区別、〜*は大文字と小文字を区別しない)。私はすべての正規表現ディレクティブが他のどのディレクティブよりも先に処理されると信じていますが、私は修正する必要があります。

だから私が使っているとき:

location ~/store {
       rewrite /trade permanent;
}

正規表現はありません。それは単に/ storeを照合し、トレードにリダイレクトするだけです。

いくつかの調査(そしてごみである私の正規表現を磨き上げた)の後で、私はそれに戻り、実用的な解決策を思いつきました。

location ~ ^/store/(.*) {
            rewrite ^/store(.*) /trade permanent;
    }

ここで、〜を入力して正規表現を処理し、任意のURLをその中の/ store /と一致させるようにディレクティブに要求しています。

次に、ドキュメントによると、書き換え構文は次のとおりです。

正規表現の置き換えを書き換える[フラグ]

そのため、ストアを含むすべてのURLを照合し、それらを新しいサブフォルダーに永続的にリダイレクトしています。

本当にとても簡単、恥ずかしいほど実際はそうですが、ちょっと、毎日が学校の日です。私はこのすべての修正を受け入れるつもりです。

5
user1214769

location ~ \.php$ハンドラーが古いフォルダーの下のURLを取得しないようにする必要があります。確かに、優先ルールは http://nginx.org/r/location 内に明確に文書化されており、正規表現を使用することもできますが、 、プレフィックスベースのマッチングを^~修飾子とともに使用して、その正規表現ベースの\.php$locationが一致するかどうかを確認せずに検索を停止するように指示します。

    location ^~ /old/long/path/ { # will match /old/long/path/index.php, too
        rewrite  ^/old/long/path/(.*)$  /new/$1  permanent;
    }

上記のスニペットは、これを行う最も効率的な方法ですが、同じことを行う別の方法を次に示します。

    location ~ /old/long/path/(.*) {
        return  301  /new/$1$is_args$args;
    }

1つの例に$is_args$argsがあり、他の例にはないのはなぜですか?良い質問! locationディレクティブとrewriteディレクティブの最初のパラメーターは、どちらも$uriではなく$request_uri変数の内容に基づいて動作することに注意してください。短い話ですが、$uriには$argsが含まれていないため、どちらの場合も$1にはargsが含まれません。ただし、rewriteの場合、新しい文字列が$args文字で終了しない限り、?がnginxによって自動的に追加されるケースが一般的であると見なされます。 http://nginx.org/r/rewrite

1
cnst