内容协商,当webp文件不存在时向Symfony发送webp请求

内容协商,当webp文件不存在时向Symfony发送webp请求

在 Apache Httpd 2.4 上,我知道.htaccess可以从文件中执行此操作

RewriteCond %{HTTP_ACCEPT} image/webp
RewriteCond %{DOCUMENT_ROOT}/$1.webp -f
RewriteRule (.+)\.jpg$ $1.webp [T=image/webp]

为了实现内容协商对于 jpg 请求,如果浏览器支持,则返回 webp。

好的,我想在 webp 文件不存在时将请求发送到 Symfony,以便特定的 Symfony 控制器可以根据需求创建 webp 版本,我知道我可以这样做

RewriteCond %{HTTP_ACCEPT} image/webp
RewriteCond %{DOCUMENT_ROOT}/$1.webp -f
RewriteRule (.+)\.jpg$ $1.webp [T=image/webp]

RewriteCond %{HTTP_ACCEPT} image/webp
RewriteCond %{DOCUMENT_ROOT}/$1.webp !-f
RewriteRule (.+)\.jpg$ index.php [PT]

但这会将原始 jpg 请求发送给 Symfony,是否可以通过.htaccess重写将 webp 请求发送给 Symfony?

答案1

RewriteCond %{HTTP_ACCEPT} image/webp
RewriteCond %{DOCUMENT_ROOT}/$1.webp !-f
RewriteRule (.+)\.jpg$ index.php [PT]

但这会将原始 jpg 请求发送给 Symfony

是的,但是您不需要原始.jpg请求才能知道如何生成相应的.webp图像吗?.webp除了文件扩展名之外,URL 路径是相同的。然后,您将在 PHP 代码中执行相同的检查……您已经知道该.webp文件不存在,因此您只需检查AcceptHTTP 请求标头,生成.webp图像并提供服务(如果没有图像,则为 404)。

如果不从根本上改变 Symfony 检查请求的方式,就不可能“重写”对 webp 的请求并期望 Symfony 能够接受它。(尽管如上所述,我不明白为什么您需要这样做。)

您或许可以传递一个 URL 参数来指示您的脚本.webp应该生成图像,但这并不否定与上述相同的检查的需要,因此实际上没有必要。例如:

:
RewriteRule (.+)\.jpg$ index.php?generate-image=$1.webp [L]

然后, URLgenerate-image参数包含要生成的图像的文档根目录相对(无斜杠前缀)的 URL 路径.webp

注意:您应该L在此规则上使用标志,而不是PT。您的其他规则也应该包含L标志。

相关内容