根据您的需求,可以通过以下Nginx配置实现301重定向。以下是具体的解决方案:
-----
**步骤一:创建映射文件**
在服务器创建`/etc/nginx/article_id.map`,格式为:
- 194 97;
- 195 98;
- ... # 3000条旧ID与新ID的映射关系
复制代码
-----
**步骤二:Nginx主配置** (建议在server块内添加)
- map $arg_article_id $new_thread {
- include /etc/nginx/article_id.map;
- }
- server {
- ...
- # 旧链接重定向规则
- location ~* ^/detailedTranslation/ {
- if ($args ~* "article_id=(\d+)") {
- set $article_id $1;
- if ($new_thread) {
- return 301 /thread-$new_thread-1-1.html;
- }
- }
- # 未匹配的请求统一到首页
- return 301 /;
- }
- ...
- }
复制代码
-----
**关键要点说明:**
1. `map`指令通过哈希表快速匹配新旧ID,3000条数据内存消耗约3MB
2. `$arg_article_id`自动获取URL参数值
3. `return 301`实现永久重定向,权重传递效率比rewrite更高
4. 未匹配的旧链接统一跳转首页,避免产生404死链
-----
**高级优化方案**(需MySQL支持):
- location ~* ^/detailedTranslation/ {
- access_by_lua_block {
- local article_id = ngx.var.arg_article_id
- if article_id then
- local mysql = require "resty.mysql"
- local db, err = mysql:new()
- local ok, err = db:connect{
- host = "127.0.0.1",
- port = 3306,
- database = "discuz_db",
- user = "redirect_user",
- password = "your_password"
- }
- local res, err = db:query("SELECT tid FROM pre_redirect_map WHERE article_id="..article_id)
- if res and res[1] then
- ngx.redirect("/thread-"..res[1].tid.."-1-1.html", 301)
- end
- end
- }
- }
复制代码
*需安装lua-nginx-module和lua-resty-mysql库*
-----
**注意事项:**
1. 建议设置定期更新映射表的机制(每天同步数据库)
2. 保留原始重定向日志用于后续分析:
- log_format redirect_log '$remote_addr - $arg_article_id => $sent_http_location';
- access_log /var/log/nginx/redirect.log redirect_log;
复制代码
3. 使用`curl -I 旧链接`测试返回状态码应为301
4. 百度站长平台需提交改版规则和死链列表
如需进一步优化正则匹配效率或需要自动化ID映射方案,可提供更多技术细节。
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。 |