web-dev-qa-db-ja.com

nginx return 301 /リダイレクト

すべての「nginxでのリダイレクト」の質問の中で、正規表現を使用してリダイレクトする方法を見つけることができませんでした(return 301を使用し、ifsを使用しない方がよい)。

私のウェブサイトへのリンクがあり、最後にパラメータを削除したいと思います:

domain.com/article/some-sluggish-link/?report=1        #number at end

これを見つけるための正規表現:

\?report=\d*$

このために私は301リダイレクトをしたい:

domain.com/article/some-sluggish-link/

私はnginx.confに3つのリダイレクトがあります:

server {        
    listen 80;      
    server_name subdomain.example.com.; #just one subdomain 
    }

server {
    listen 80;
    server_name  *.example.com;         
    return 301 http://example.com$request_uri;
    }

server {
    listen 80;
    server_name  example.com;
    }

そしてそれは機能します。すべてのwww。、ww。、aaa。、および特定の1つを除くすべてのサブドメインをメインdomain.comにリダイレクトします。

応援よろしくお願いします!

2015年3月25日編集

私はすでにconfファイルに「location /」を持っています:

location / {  
    uwsgi_pass unix://opt/run/ps2.sock;  
    include uwsgi_params;  
    }

これはいくつかのDjango appにリダイレクトします。'if '句を適用した後、無限ループになります!!!

私の問題は基本的にSEOにあります。つまり、グーグルはこの末尾のパラメーターのないURLのコピーである特定のページ( '?report ='パラメーターを持つページ)にインデックスを付けます。

Googlebotにrobots.txtを使用したインデックス作成を停止させたかったのですが、問題は、このファイルで正規表現を使用できないことです。また、どのURLをリダイレクトするか、インデックス作成を停止する必要があるかを正確に言うことはできません。これは、何らかの理由でランダムに発生するためです...

4
ppp

私はこれを自分で試したことがありませんが、うまくいくはずです。これをサーバー{}ブロック内に追加します。

_location / {
    if ($args !~ ^$) {
        rewrite ^ $request_uri? permanent;
    }
}
_

このブロックが実際に行うこと:

_location /_は、ルートディレクトリとサブディレクトリに一致するすべてのリクエストにこれらのディレクティブを適用するようにnginxに指示します。

if ($args !~ ^$)は、URIに正規表現のクエリパラメータが含まれているかどうかを確認します。

_rewrite ^ $request_uri? permanent;_は、クエリパラメータなしで目的のURIにリダイレクトします。 $ request_uriの最後にある_?_は、リダイレクトURLからクエリパラメーターを削除するようにnginxに指示します。

1
Tero Kilkanen