htaccess重写从CDN在webp中提供的图像的规则



我正在提供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/.htaccessAFAIK等功能。

请参阅此处:Amazon S3和.htaccess

我的回答的其余部分是假设cdnCNAME指向您的应用程序/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文件扩展名。

最新更新