利用Nginx的map实现URL对301重定向

Linux基础 思享 110浏览
摘要:
后来我们把文章做完了,修改了文章链接,但是这个时候原文章已经被收录了,用户点击会导致404,这个很不好。更好的办法是利用Nginx的301永久重定向,让用户在访问无效页面时自动跳转到新页面,不影响SEO。使用 301 重定向永久重定向页面。 “永久”一词意味着重定向页面的所有权重都传递给指向页面。错误地使用 302 重定向是非常危险的。

很多时候,我们先写了一篇文章,但是还没来得及命名号好友好的url,就已经发出去了。后来我们完成了文章,修改了文章链接,但是这时候原先的文章已经被收录了,用户点击就会导致404。这样是非常不好的,一个比较好的办法就是利用Nginx的301永久重定向,这样用户访问失效的页面就能自动跳转到新压面,还不会影响SEO。

链接错误对SEO的影响

301重定向

使用301重定向来永久重定向页面。“永久”这个词意味着重定向页面的所有权重都会被传递到指向页面。

如果我们把一个地址采用301跳转方式跳转的话,搜索引擎会把老地址的PageRank等信息带到新地址,同时在搜索引擎索引库中彻底废弃掉原先的老地址。

一般使用301比较好。

302重定向

302重定向,一般是做临时性的跳转,是暂时性的,在使用的过程中也会比较常见,不过各位在使用的过程中不要使用太多的302重定向,因为搜索引擎会认为新的跳转url是临时性的,用得过多的话,可能会导致降权处理,这个也是我们必须要去重视的一个地方,千万不要因为使用比较多的302重定向,而导致我们的网站被降权。

302重定向将不会将重定向页面的所有权重质量传递到指向页面。重定向页面仍将保留其网页排名、页面权限和流量价值。并且指向页面不会累积任何页面的权重。

错误地使用302重定向是非常危险的。这会严重损害你网站的搜索引擎可见性。

#Nginx的配置

修改 nginx.conf 文件配置如下:

map_hash_max_size 262144; # see http://nginx.org/en/docs/hash.html
map_hash_bucket_size 262144;
map $request_uri $new_uri {
    include /usr/local/docker/nginx/www/seo301.map; # or any file readable by nginx
}

server {
    listen     80;
    charset utf-8;

    location / {
        # 对应静态资源文件夹
        root /usr/local/docker/nginx/www;
        # 对应首页
        index index.html;
        # 解决登录之后刷新404
        # try_files $uri $uri/ /index.html;

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

PS:如果你使用的是 docker 部署,注意要加上目录映射,例如我的 docker-compose.yml 文件:

version: '3'
services:
  bugucms-nginx:
    image: bugucms/nginx:1.15.9
    container_name: bugucms-nginx
    build:
      context: ./
      dockerfile: ./bugucms-nginx/Dockerfile
    ports:
      - "80:80"
    volumes:
      - ./bugucms-nginx/nginx.conf:/etc/nginx/conf.d/default.conf
      - ./data/nginx/log:/var/log/nginx
      - /var/lib/jenkins/workspace/gitee-pages:/usr/local/docker/nginx/www
    restart: always

结合Vdoing主题生成seo301.map文件

生成的seo301.map文件

/pages/790154/ /post/netty-codec.html;
/pages/efebb8/ /post/http-server-development-based-on-netty.html;

生成map的js代码

seo301.js

/**
 * 生成301映射文件
 */
const fs = require('fs');
const path = require('path');
const chalk = require('chalk')
const matter = require('gray-matter'); // FrontMatter解析器 https://github.com/jonschlinkert/gray-matter
const readFileList = require('./modules/readFileList');
const urlsRoot = path.join(__dirname, '..', 'seo301.map'); // 百度链接推送文件
const DOMAIN = process.argv.splice(2)[0]; // 获取命令行传入的参数
const dayjs = require('dayjs')

main();

/**
* 主体函数
*/
function main() {
    // 解决下面一行会产生的空行问题
    fs.closeSync(fs.openSync(urlsRoot, 'w'));
    // fs.writeFileSync(urlsRoot, "")

    const files = readFileList(); // 读取所有md文件数据

    let idx = 1;
    files.forEach(file => {
        const { data } = matter(fs.readFileSync(file.filePath, 'utf8'));
        if (data.oldlink && data.permalink) {
            console.log("301映射from=>", data.oldlink)
            console.log("301映射to=>", data.permalink)
            if(idx > 1){
                fs.appendFileSync(urlsRoot, "n");
            }
            fs.appendFileSync(urlsRoot, data.oldlink);
            fs.appendFileSync(urlsRoot, " ");
            fs.appendFileSync(urlsRoot, data.permalink);
            fs.appendFileSync(urlsRoot, ";");
            idx++;
        }
    });
    console.log("301映射完成")
}

参考

https://stackoverflow.com/questions/29354142/nginx-how-to-mass-permanent-redirect-from-a-given-list(opens new window)链接

https://www.cnblogs.com/shichangchun/p/11653487.html链接

推荐阅读

网站被惩罚后,301重定向到新注册的域名有没有影响?

有影响。...

301重定向是传递所有权重还是部分?

正常的301永久重定向,旧url上积累的各种属性会全部转移到新url上。...

域名被劫持导致被K,301到新域名能恢复吗?

已经被K了,还做301何用?...