CDN后WordPress站点:绕过CDN调试的Nginx URL改写需求
我来帮你搞定这两个核心需求:禁止爬虫索引调试用的源站和透明改写响应中的CDN链接,全程用Nginx就能完美解决,不用修改WordPress代码或数据库,完全透明化处理。
第一步:配置robots.txt避免SEO问题
既然是调试用的源站访问,绝对不能让搜索引擎爬虫爬取。我们直接在Nginx里返回自定义的robots.txt,不用改动WordPress本身的文件,这样也不会影响通过CloudFront访问的正常站点。
在你的Nginx server块里添加这段配置:
location = /robots.txt { return 200 "User-agent: *\nDisallow: /\n"; }
这段配置会在访问https://www-origin.example.com/robots.txt时,直接返回禁止所有爬虫访问的内容,简单高效,不会干扰主站的SEO。
第二步:用Nginx的sub_filter模块改写CDN链接
WordPress存储的绝对URL会导致响应内容里全是CloudFront的域名,我们可以用Nginx自带的sub_filter模块,在响应返回给客户端之前,把所有CDN域名替换成源站域名,完全透明,用户和WordPress都感知不到这个替换过程。
先确认模块是否启用
首先检查你的Nginx是否安装了sub_filter模块,执行命令:
nginx -V | grep sub_filter
如果输出里有--with-http_sub_filter_module,说明模块已启用;如果没有,可能需要重新编译Nginx并加上这个参数(大部分主流发行版的预编译Nginx都默认包含这个模块)。
添加URL改写配置
在你的Nginx server块或者主location /块里添加以下配置:
# 替换所有出现的CDN域名(HTTPS版本) sub_filter 'https://www.example.com' 'https://www-origin.example.com'; # 如果站点存在HTTP的旧链接,也可以加这一条兼容 # sub_filter 'http://www.example.com' 'http://www-origin.example.com'; # 替换所有匹配项(默认只替换第一个,必须打开这个) sub_filter_once off; # 对所有类型的响应内容都进行替换(HTML、CSS、JS、图片引用等) sub_filter_types *;
如果你的Nginx是直接处理WordPress的FastCGI请求(比如通过php-fpm),完整的server块参考示例:
server { listen 443 ssl; server_name www-origin.example.com; # 你的SSL证书配置(保留现有即可) ssl_certificate /path/to/your/cert.pem; ssl_certificate_key /path/to/your/key.pem; # 处理robots.txt location = /robots.txt { return 200 "User-agent: *\nDisallow: /\n"; } # 静态文件缓存配置(保留现有即可) location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ { root /path/to/your/wordpress; expires 30d; add_header Cache-Control "public, immutable"; } # PHP/FastCGI核心处理 location ~ \.php$ { root /path/to/your/wordpress; fastcgi_pass unix:/run/php/php8.2-fpm.sock; # 换成你的php-fpm地址 fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; # 传递正确的Host头给WordPress(可选但推荐,避免WordPress生成错误URL) fastcgi_param HTTP_HOST $host; fastcgi_param HTTPS on; } # 全局URL改写配置 sub_filter 'https://www.example.com' 'https://www-origin.example.com'; sub_filter_once off; sub_filter_types *; }
最后一步:测试并生效
配置完成后,先检查Nginx配置是否合法:
nginx -t
如果提示test is successful,就重启Nginx让配置生效:
systemctl restart nginx
现在你访问https://www-origin.example.com时,页面里所有原本指向CloudFront的链接都会被自动替换成源站域名,同时爬虫也会被robots.txt禁止访问,完美满足你的调试需求。
内容的提问来源于stack exchange,提问作者DaanV

