Удалите дублирующиеся расширения в файле с .htaccess - PullRequest
1 голос
/ 26 февраля 2020

Я поигрался с .htaccess, чтобы попытаться переписать изображения для определенного c браузера (Safari).

У меня есть загруженные изображения с именами: myimage.png.webp, и я хотел бы удалите .webp, оставив myimage.png, чтобы теги <img> указывали на дубликат файла, который не является WebP.

Это то, что я до сих пор пытался исправить вместе, но это только привело к в 500 Ошибка, и я сейчас путаюсь с правилами. Кто-нибудь может помочь?

#RewriteCond %{HTTP_USER_AGENT} Safari
# check if an image was requested   
#RewriteCond %{REQUEST_FILENAME} .(jpe?g|gif|bmp|png|svg).webp -f
#RewriteRule ^.*/uploads/(.*).(svg|png|jpe?g|gif|bmp).webp$ https://%{HTTP_HOST}/uploads/$1.$2 [L,R=302]

Ответы [ 3 ]

1 голос
/ 26 февраля 2020

Ваши директивы, кажется, делают противоположное тому, что вы пытаетесь сделать, как если бы вы ссылались на файл 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, поскольку это регулярное выражение.

1 голос
/ 27 февраля 2020

Мне удалось заставить его работать так, как мне нужно, и с небольшой помощью двух других ответов мое правило htaccess делает то, что я ожидаю:

# 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]

Так что это будет изображение URL-адрес, подобный следующему: https://example.com/uploads/test.png.webp, и поменяйте его на резервное дублированное изображение в Safari / iOS (где webp все еще не поддерживается) и выведите в браузер: https://example.com/uploads/test.png

1 голос
/ 26 февраля 2020

Вы можете попробовать это правило на своем сайте root .htaccess:

RewriteCond %{HTTP_USER_AGENT} Safari
RewriteCond %{REQUEST_FILENAME}.webp -f
RewriteRule ^.+\.(?:svg|png|jpe?g|gif|bmp)$ $0.webp [L,NC]
...