Nginx:将 https://www.domain.tld/target 重定向到 https://nocache.domain.tld/destination

Nginx:将 https://www.domain.tld/target 重定向到 https://nocache.domain.tld/destination

我有一个带有大量缓存的 Cloudflare/Nginx(v1.8.0)/Apache 服务器配置。

目标是缓存主域,但允许通过绕过所有缓存的子域访问站点。

因此,我正在寻找一种通用的方法来重定向“https://www.domain.tld/target“ 到 ”https://nocache.domain.tld/destination

对于非 www 域名变体,与 request_uri 进行简单的位置匹配就足够了,但如果请求通过 www 子域名进入(就像许多网站一样),那么它会重定向到不存在的 nocache.www.domain.tld。

我尝试了各种不同的方法来删除“www.”子字符串,但似乎没有任何效果。

编辑

这是我的未工作的 Nginx 服务器配置:

server {

  listen 80 default_server;

  server_name localhost;

  set $PROXY_DOMAIN_OR_IP $host;

  if ( $request ~* ".*(www\.)(.*)\/target" ) {
     set $host_without_www $2;
     return 302 $scheme://nocache.${host_without_www}\/destination;
  }

答案1

这是可用于重定向的位置块

server {
    server_name www.domain.tld;
    location /target {
        rewrite /target(.*)$ /destination$1 last;
        return 301 https://nocache.domain.tld$request_uri;   
    }
}
  • server_name 限制重定向到www.domain.tld
  • 该位置与所有以 /target 开头的 URI 匹配
  • 重写指令将 /target 转换为 /destination,并保留其后出现的所有内容
  • 返回将重定向推送至其他域名
  • 如果你不想让用户被重定向,你也可以使用代理传递来做到这一点

答案2

最终使其工作如下:

location ~* "/target" {
  if ( $host ~* "www\.(.*)" ) {
    return 302 https://nocache.$1/destination;
  }

  return 302 https://nocache.$host/destination;
}

302 用于测试并将更改为永久重定向。

感谢所有回复的人。

相关内容