我正在提供S3 bucket中的图像,该bucket具有cname";cdn";
我上传了我的图像的webp副本,并试图用htaccess 重写路径
目前我所有的图片都在子域cdn.mydomain.com 下
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP_ACCEPT} image/webp
RewriteCond %{HTTP_HOST} ^cdn.mydomain.com$/wp-content/uploads-webpc/$1.jpg.webp -f
RewriteRule wp-content/uploads/(.+).jpg$ wp-content/uploads-webpc/$1.jpg.webp [T=image/w
ebp]
</IfModule>
我的图像来自S3 bucket,它有cname"cdn";
如果你的意思是你有一个直接指向你的Amazon S3存储桶的DNS CNAMEcdn
,那么这个方法不太可能工作,因为S3只是一个静态存储解决方案,不提供Apache/.htaccess
AFAIK等功能。
请参阅此处:Amazon S3和.htaccess
我的回答的其余部分是假设cdn
CNAME指向您的应用程序/Apache服务器(如果您想在代理请求之前检查这些文件的存在,.webp
映像也位于/重复的位置(,然后您将请求代理到您的AmazonS3存储桶,尽管这在一定程度上违背了最初使用CDN的意义。
RewriteCond %{HTTP_ACCEPT} image/webp RewriteCond %{HTTP_HOST} ^cdn.mydomain.com$/wp-content/uploads-webpc/$1.jpg.webp -f RewriteRule wp-content/uploads/(.+).jpg$ wp-content/uploads-webpc/$1.jpg.webp [T=image/webp]
第二个条件本应针对HTTPHost
标头进行检查,但它完全无效,您可能会生成500内部服务器错误响应(由于"错误的标志分隔符"(。Host
标头仅包含主机名,例如cdn.mydomain.com
,而不包含URL路径(尽管regex也无效(。要检查目标文件的存在,您需要另一个/单独的条件。(如果CNAME直接指向S3存储桶,那么无论如何,这种检查都可以说是多余的,因为不是所有请求都收到了同一个主机名吗?(
在RewriteRule
模式上,您还缺少字符串锚的开头(即^
(,因此这会创建多对一重写(可能是重复的内容问题(,因为它会将/wp-content/uploads/image.jpg
和/foo/wp-content/uploads/image.jpg
重写到相同的目标URL,即wp-content/uploads-webpc/image.jpg.webp
。
您缺少RewriteRule
上的L
(last
(标志。如果您有其他指令,则会出现问题。
您还可以捕获请求的URL路径的更多元素,以避免替换字符串中的重复。
假设您打算将请求从/wp-content/uploads/image.jpg
重写为/wp-content/uploads-webpc/image.jpg.webp
,那么请尝试以下操作,将以上几点结合起来:
RewriteEngine On
RewriteCond %{HTTP_ACCEPT} image/webp
RewriteCond %{HTTP_HOST} ^cdn.mydomain.com$
RewriteCond %{DOCUMENT_ROOT}/wp-content/uploads-webpc/$1.jpg.webp -f
RewriteRule ^(wp-content/uploads)/([^./]+.jpg)$ $1-webpc/$2.webp [T=image/webp,L]
请注意,$1
反向引用只是捕获请求的URL路径的wp-content/uploads
部分,因此请保存重复。$2
反向引用现在也捕获了.jpg
文件扩展名。