我使用 nginx 中的以下重写指令将静态文件的 URL 重写到外部 CDN 服务器。
rewrite ^/static/(css|images|js)/([a-z_\-\.]+)$ http://cdn.domain.com/$1_$2 last;
它可以工作,但它会在浏览器中自动重定向 URL。
我怎样才能在不使用重定向的情况下完成上述重写?
答案1
您需要更改应用程序内的链接以指向静态包含的 CDN。
当您重写到 http 位置时,nginx 只能重定向浏览器(因为 CDN 在 nginx 之外,而浏览器需要从 CDN 获取文件)。使用 Apache 或任何其他 URL 重写器时,您都会遇到同样的问题,因为 CDN 不是 Web 服务器的“内部”位置。
一种选择可能是 nginx 替换模块,它可以在传递内容时替换内容。但这不能处理正则表达式,并且会减慢每个请求的速度。最好只是更改应用程序的 HTML 以直接引用 CDN URL。
答案2
nginx 区分大小写(功能或错误),请使用 HTTP:// 而不是 http:// 例如:
rewrite ^/static/(css|images|js)/([a-z_\-\.]+)$ HTTP://cdn.domain.com/$1_$2 last;
但请求将发送到 proxy_pass 服务器,并且只有当 proxy_pass 中的服务器也是 web 代理服务器时它才有效,谁知道
GET HTTP://cdn.domain.com/ HTTP/1.0
答案3
如果您想隐藏外部 CDN 服务器的 URL,您必须找到支持别名的 CDN。然后将您的子域名 (cdn.yourdomain.com) 指向 CDN。