301重定向/所有图片到CDN

Posted

技术标签:

【中文标题】301重定向/所有图片到CDN【英文标题】:301 redirect / all images to CDN 【发布时间】:2015-05-30 23:53:35 【问题描述】:

对于图片库,我必须使用 CDN。为此我创建了一个子域

image.example.com

此子域通过 CNAME 指向 CDN URL。

旧图片路径:

http://www.example.com/files/thumbs

我将图库中的所有图片路径更改为:

http://images.example.com/files/thumbs

我需要来自

的 301 重定向
http://www.example.com/files/thumbs

http://images.example.com/files/thumbs

我已经发了一篇关于这个的帖子。

Redirect folder to subdomain with folder

与 anubhava 协调,我现在提出一个新问题。

我试过了:

RewriteCond %HTTP_HOST ^(?:www\.)?example\.com$ [NC]
RewriteRule ^(files/thumbs/.*)$ http://images.example.com/$1 [L,R=301,NC]

还有这个:

RewriteRule ^(files/thumbs/.*)$ http://images.example.com/$1 [L,R=301,NC]

这两个规则都会导致:重定向过多/永无止境。

重要:

当 CDN 缓存了图像后,一切正常。 CDN 需要 2 个请求,而第 3 个请求是成功的。当 CDN 没有命中(第一个或第二个请求)时,重定向不起作用。 当 CDN 丢失文件时,本地服务器提供图像。有符合我需要的规则吗?

非常感谢

-----添加了有关问题的更多信息----

我们有 2 个场景 - HIT 和 MISS:

场景 1 - HIT

请检查以下步骤并注意 X-Cache 和顶部的 http 状态代码:

1. curl -I http://images.example.com/files/thumbs/my-cache-hitting-image.jpg

HTTP/1.1 200 OK
Date: Fri, 27 Mar 2015 07:37:10 GMT
Content-Type: image/jpeg
Content-Length: 14525
Connection: keep-alive
Last-Modified: Thu, 19 Mar 2015 12:44:39 GMT
Cache-Control: max-age=2592000
Expires: Sun, 26 Apr 2015 07:37:10 GMT
Vary: User-Agent
Server: NetDNA-cache/2.2
X-Cache: HIT
Accept-Ranges: bytes

现在我们检查重定向操作(打开旧网址):

curl -I http://www.example.com/files/thumbs/my-cache-hitting-image.jpg

HTTP/1.1 301 Moved Permanently
Date: Fri, 27 Mar 2015 07:39:06 GMT
Server: Apache
Location: http://images.example.com/files/thumbs/my-cache-hitting-image.jpg
Vary: Accept-Encoding
Content-Type: text/html; charset=iso-8859-1

完美 - 大功告成!


场景 2 - 小姐

curl -I http://images.example.com/files/thumbs/my-cache-missing-image.jpg

HTTP/1.1 301 Moved Permanently
Date: Fri, 27 Mar 2015 07:41:27 GMT
Content-Type: text/html; charset=iso-8859-1
Content-Length: 278
Connection: keep-alive
Location: http://images.example.com/files/thumbs/my-cache-missing-image.jpg
Vary: Accept-Encoding
Server: NetDNA-cache/2.2
Expires: Sun, 26 Apr 2015 07:41:27 GMT
Cache-Control: max-age=2592000
X-Cache: MISS

Fazit:当有 MISS 时,会导致 Loop,因为 CDN 将请求返回给源站,而源站正在这样做:

curl -I http://www.example.com/files/thumbs/my-cache-missing-image.jpg

HTTP/1.1 301 Moved Permanently
Date: Fri, 27 Mar 2015 07:26:13 GMT
Server: Apache
Location: http://images.example.com/files/thumbs/my-cache-missing-image.jpg
Vary: Accept-Encoding
Content-Type: text/html; charset=iso-8859-1

这是一个永无止境的循环。也许有一种方法可以通过 httaccess Cond 检查状态码?!

【问题讨论】:

谢谢。也许这真的是因为当 Cache 访问它的 http 主机时,它会被路由回我的服务器。 @anubhava 我添加了更多信息。请检查这个。也许它可以帮助您找到解决方案。现在一切对你来说都应该很清楚了。非常感谢。 @Jon Lin 你知道如何解决这个问题吗? 非常感谢您的热情回复。我很感激。在 CDN 设置中有一个名为“origin url”的字段。我的意思是“请求返回源”,即当 CDN 没有图像时,源 URL 将提供图像。这里稍微解释一下(nginxmaxcdn.com/one/tutorial/setting-reverse-proxy-nginx)希望有解决办法。 听起来您的 CDN 和站点配置错误。您需要将应用程序中的所有链接更改为指向 CDN,并且需要将 CDN 指向您的站点。这样,它总是有一个不会尝试重定向回自身的静态来源。您还可以为您的网站创建一个别名,作为 CDN 的来源。 【参考方案1】:

我找到了一个解决方法。也许有人会需要它:

当我想要从旧(索引)url 重定向到 cdn url 并 cdn 将其返回到也是旧 url 的原始 url 时,它当然会进入循环。

解决方案:创建一个不同的 URL,CDN 可以在其中捕获文件。因此,请执行以下操作:

创建子域 - 示例:

catcher.example.com (normal A record)

将此子域指向您网站的根目录。必须与原始网站目录相同。

将 catcher.example.com 添加到 CDN 设置中的源 URL。

添加一个重写条件,仅当存在旧 url 而不是来自我们的 catcher.example.com 时才会强制重定向

RewriteCond %REQUEST_URI ^/files/thumbs  
RewriteCond %HTTP_HOST ^www.example.com$
RewriteRule ^(files/thumbs/.*)$ http://images.example.com/$1 [L,R=301,NC]

(我需要第一个 RewriteCond 吗?)以防万一我添加了。

结果:不再循环。因为这样 CDN 可以从 catcher.example.com 捕获文件,并且 OLD 链接会重定向到 apache 而不会导致循环。 CDN 可以从哪里捕获文件并不重要,只要它是具有相同目录路径的相同文件即可。

第一次测试成功。当我错了,请纠正我。

【讨论】:

是的,这是一个很好的解决方法,是的,首先RewriteCond 不需要。 很棒的解决方案,它可以工作,但需要将 URL 从 HTTP 更改为 HHTPS。谢谢

以上是关于301重定向/所有图片到CDN的主要内容,如果未能解决你的问题,请参考以下文章

301 将所有页面重定向到新站点 除了 1 个目录

将 301 从目录重定向到单个文件

301 将所有页面重定向到新域上的同一页面

我如何 .htaccess 301 将所有页面/文件(除了一个)重定向到新域?

apache_conf 通过重定向301重定向所有网站([R = 301,L])

如何在 nginx 服务器上做 301 重定向