Ваши директивы, кажется, делают противоположное тому, что вы пытаетесь сделать, как если бы вы ссылались на файл myimage.png.webp
и извне перенаправляли на файл myimage.png
?
Я предполагаю, что вы уже ссылаетесь на файл myimage.png
(как указано). Затем нам нужно выполнить анализ некоторых функций, чтобы убедиться, что браузер может поддерживать файлы webp (и что файл .webp
действительно существует) перед переписыванием запроса.
Например:
RewriteCond %{HTTP_ACCEPT} image/webp
RewriteCond %{DOCUMENT_ROOT}/$1.$2.webp -f
RewriteRule (.+)\.(png|jpe?g|gif)$ /$1.$2.webp [T=image/webp,L]
Флаг T
гарантирует, что мы отправим обратно соответствующий MIME-тип для ответа webp.
ОБНОВЛЕНИЕ: Кажется, вы на самом деле ссылаетесь на изображение .webp
и wi sh чтобы переписать соответствующий png / jpg / gif, когда webp не поддерживается (ie. Safari) ...
# Rewrite images to WebP if they exist
RewriteCond %{HTTP_USER_AGENT} Safari
RewriteCond %{DOCUMENT_ROOT}/$1.$2.webp -f
RewriteRule (.*).(png|jpe?g|gif).webp$ $1.$2 [T=image/$2,L]
Это не совсем правильно :
Safari - не единственный браузер, который не поддерживает изображения webp. Примечательно, что есть IE11 (который все еще имеет разумную долю рынка, безусловно, сопоставимую с Safari в некоторых демографических данных) и другие второстепенные браузеры (например, Ka iOS). Проверяя user-agent, вы также должны обновить правило, когда эти браузеры поддерживают изображения webp. Поэтому предпочтительнее вместо этого проверить, поддерживает ли браузер image/webp
изображения (или нет), проверив заголовок HTTP-запроса Accept
.
2-е условие - проверка, является ли .webp
изображение существует до перезаписи на изображение без webp. Предположительно, вы хотите проверить, существует ли изображение, не относящееся к webp (или вообще удалить это условие - поскольку запрос, по-видимому, в любом случае «провалится», если пользовательский агент не поддерживает изображения webp).
Возвращенный MIME-тип будет неправильным, если ваши изображения .jpg
(в отличие от .jpeg
), поскольку image/jpeg
- правильный MIME-тип, а не image/jpg
. Это сложнее исправить, если только вы не разбили это на собственное правило.
Вместо этого попробуйте следующее:
# Rewrite images to non-WebP if webp are not supported and they exist
RewriteCond %{HTTP_ACCEPT} !image/webp
RewriteCond %{DOCUMENT_ROOT}/$1.$2 -f
RewriteCond $2@jpeg ^jpe?g@(.+)|(.+)@
RewriteRule (.+)\.(png|jpe?g|gif)\.webp$ $1.$2 [T=image/%1%2,L]
(скорее crypti c) 3-е условие извлекает требуемую «часть» MIME-типа: png
, jpeg
или gif
соответственно, независимо от того, запрашивается .jpg
или .jpeg
. Они сохраняются в обратных ссылках %1
и %2
. Обратите внимание, что они являются взаимоисключающими. Либо %1
содержит jpeg
(и %2
пусто), либо OR %2
содержит png
или gif
(и %1
пусто). Так что вместе они образуют правильный ответ.
Обратите внимание, что буквенные точки в RewriteCond
TestString не нужно экранировать, поскольку это "обычный" Строка Однако буквальные точки в шаблоне RewriteRule
должны быть экранированы sh, поскольку это регулярное выражение.