对于图像库,我必须使用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
我已经发了一篇关于这个的帖子。
使用文件夹将文件夹重定向到子域
在与阿努巴瓦的协调下,我现在提出一个新的问题。
我试过这个:
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丢失文件时,本地服务器会为图像提供服务。有符合我需要的规则吗?
非常感谢
-----添加了有关该问题的更多信息----
我们有两种情况-命中和未命中:
场景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
现在我们检查重定向操作(打开旧url):
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检查状态代码?!
我找到了一个解决方法。也许任何人都需要它:
当我想要从旧的(索引的)url重定向到cdn url,并且cdn将其返回到原始url(也是旧的url)时,它当然会运行到一个循环中。
解决方案:创建一个不同的URL,CDN可以在其中捕获文件。因此,请执行以下操作:
创建子域-示例:
catcher.example.com (normal A record)
将此子域指向您的网站根目录。必须是与原始网站目录相同的目录。
将catcher.example.com添加到CDN设置中的原始URL。
添加一个重写cond,仅当存在旧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从哪里可以捕获文件并不重要,只要它是具有相同目录路径的相同文件即可。
第一次测试成功。如果我错了,请纠正我。