4

ブログを から に移動中a.comですb.com。ここで、すべてのブログ投稿 (約 100 件) が に移動されたことを Google /bookmarks に伝えたいと思いますb.com。ブログ投稿のみをリダイレクトしたいだけで、他には何もありません。

nginx のmapモジュールについて読んだ後、次のことを試しました。

map_hash_bucket_size 128;
map $uri $new {
  /post http://b.com/post
  # (repeated for all 100 posts)
}

そして、serverブロック内に次の行を入れると:

rewrite ^ $new redirect;

100 件の投稿すべてがリダイレクトされますが、ドメインの他のすべてのページで次のエラーが発生します: 302 Found.

構成内のサーバーブロック全体を次に示します。

server {

    listen 80;
    server_name b.com;
    root /my/old/path/;
    index index.html;

    location = /favicon.ico {
            log_not_found off;
            access_log off;
    }

    location = /robots.txt {
            allow all;
            log_not_found off;
            access_log off;
    }

    # Deny all attempts to access hidden files such as .htaccess, .htpasswd, .DS_Store (Mac).
    location ~ /\. {
        deny all;
        access_log off;
        log_not_found off;
    }

    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
           expires max;
           log_not_found off;
    }

    # example.com/index gets redirected to example.com/

    location ~* ^(.*)/index$ {
        return 301 $scheme://$host$1/;
    }

    # example.com/foo/ loads example.com/foo/index.html

    location ~* ^(.*)/$ {
        try_files $1/index.html @backend;
    }

    # example.com/a.html gets redirected to example.com/a

    location ~* \.html$ {
        rewrite ^(.+)\.html$ $scheme://$host$1 permanent;
    }

    # anything else not processed by the above rules:
    # * example.com/a will load example.com/a.html
    # * or if that fails, example.com/a/index.html

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

    # default handler
    # * return error or redirect to base index.html page, etc.
    location @backend {
        try_files /404.html 404;
    }

    location ~ \.php$ {
            expires off;
            try_files $uri =404;
            fastcgi_split_path_info ^(.+\.php)(/.+)$;
            #NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini

            include fastcgi_params;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_intercept_errors on;
            fastcgi_pass php;
    }

    # apply the rewrite map
    rewrite ^ $new redirect;
}

try_files地図が場所の呼び出しを妨げていると思います\(必要です)。

4

2 に答える 2

4

serverfaultであなたの問題の解決策を見つけました:

マップ内の何かに一致したかどうかに関係なく、すべてのリクエストをリダイレクトしようとしているため、これはおそらく失敗しています。

これを防ぐには、最初に一致したかどうかを確認してください。

if ($new) {
    return 301 $new;
}

だから交換

rewrite ^ $new redirect;

if ($new) {
    return 301 $new;
}

そして、あなたは行く準備ができているはずです

于 2013-07-03T12:37:41.027 に答える
0

map でこれを行う方法を理解できませんでした。これは、まだ私にとってかなりの文字列モジュールであるためです。これで、すべての書き換えをサーバー ブロック内 (すべてのロケーション ブロックの上) のリストに入れましたが、これはおそらく非常に低速です。ファイルは次のようになります。

server {

    listen 80;
    server_name a.com;
    root /my/old/path/;
    index index.html;

    rewrite /post http://b.com/post
    # (x100)

    location = /favicon.ico {
            log_not_found off;
            access_log off;
    }

    location = /robots.txt {
            allow all;
            log_not_found off;
            access_log off;
    }

    # Deny all attempts to access hidden files such as .htaccess, .htpasswd, .DS_Store (Mac).
    location ~ /\. {
        deny all;
        access_log off;
        log_not_found off;
    }

    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
           expires max;
           log_not_found off;
    }

    # example.com/index gets redirected to example.com/

    location ~* ^(.*)/index$ {
        return 301 $scheme://$host$1/;
    }

    # example.com/foo/ loads example.com/foo/index.html

    location ~* ^(.*)/$ {
        try_files $1/index.html @backend;
    }

    # example.com/a.html gets redirected to example.com/a

    location ~* \.html$ {
        rewrite ^(.+)\.html$ $scheme://$host$1 permanent;
    }

    # anything else not processed by the above rules:
    # * example.com/a will load example.com/a.html
    # * or if that fails, example.com/a/index.html

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

    # default handler
    # * return error or redirect to base index.html page, etc.
    location @backend {
        try_files /404.html 404;
    }

    location ~ \.php$ {
            expires off;
            try_files $uri =404;
            fastcgi_split_path_info ^(.+\.php)(/.+)$;
            #NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini

            include fastcgi_params;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_intercept_errors on;
            fastcgi_pass php;
    }

    # apply the rewrite map
    rewrite ^ $new redirect;
}
于 2013-05-11T20:41:54.400 に答える