301重定向/所有图像到CDN

时间:2015-03-26 19:38:05

标签: .htaccess mod-rewrite redirect http-status-code-301

对于图片库,我必须使用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时,它会产生一个循环,因为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检查状态代码?!

1 个答案:

答案 0 :(得分:2)

我找到了一个解决方案。也许任何人都需要它:

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

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

  

创建子域 - 示例:

catcher.example.com (normal A record)
  

将此子域指向网站的根目录。必须与原始网站目录位于同一目录。

     

将catcher.example.com添加到CDN设置中的原始网址。

     

添加重写cond,只有当有OLD网址时才会强制重定向,而不是来自我们的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能够捕获文件的位置与其具有相同目录路径的相同文件一样重要。

首次测试是成功的。当我错了,请纠正我。