在 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
文件不存在,因此您只需检查Accept
HTTP 请求标头,生成.webp
图像并提供服务(如果没有图像,则为 404)。
如果不从根本上改变 Symfony 检查请求的方式,就不可能“重写”对 webp 的请求并期望 Symfony 能够接受它。(尽管如上所述,我不明白为什么您需要这样做。)
您或许可以传递一个 URL 参数来指示您的脚本.webp
应该生成图像,但这并不否定与上述相同的检查的需要,因此实际上没有必要。例如:
:
RewriteRule (.+)\.jpg$ index.php?generate-image=$1.webp [L]
然后, URLgenerate-image
参数包含要生成的图像的文档根目录相对(无斜杠前缀)的 URL 路径.webp
。
注意:您应该L
在此规则上使用标志,而不是PT
。您的其他规则也应该包含L
标志。