【问题标题】:How to only redirect urls located in a nginx Map如何仅重定向位于 nginx 地图中的 url
【发布时间】:2013-07-03 20:37:41
【问题描述】:

我正在将我的博客从 a.com 转移到 b.com。现在我想告诉 Google /bookmarks 所有博文(大约 100 篇)都已移至 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 对位置\ 的调用(我需要)。

【问题讨论】:

    标签: redirect map nginx


    【解决方案1】:

    我为您的问题找到了解决方案on serverfault

    这可能会失败,因为您正在尝试重定向所有 请求,无论它们是否匹配地图中的某些内容。

    为防止这种情况,请先检查是否有匹配项。

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

    所以替换

    rewrite ^ $new redirect;
    

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

    你应该很高兴

    【讨论】:

      【解决方案2】:

      我无法弄清楚如何使用 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;
      }
      

      【讨论】:

        猜你喜欢
        • 2015-05-30
        • 1970-01-01
        • 2015-12-30
        • 2012-05-04
        • 1970-01-01
        • 2016-12-03
        • 1970-01-01
        • 1970-01-01
        • 2023-04-11
        相关资源
        最近更新 更多