Я использую laravel и в этом каталоге publi c я использую этот .htaccess для перенаправления каждого файла jpg, jpeg или png в файл php, который может генерировать файл webp. Проблема в том, что все работает на локальном хосте, но на виртуальном хостинге .htaccess не работает.
public / .htaccess
<IfModule mod_rewrite.c>
<IfModule mod_negotiation.c>
Options -MultiViews -Indexes
</IfModule>
RewriteEngine On
# Redirect images to webp-on-demand.php (if browser supports webp)
RewriteCond %{HTTP_ACCEPT} image/webp
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^(.*)\.(jpe?g|png)$ webpondemand.php?source=%{SCRIPT_FILENAME} [NC,L]
# https://help.heroku.com/J2R1S4T8/can-heroku-force-an-application-to-use-ssl-tls
# https://stackoverflow.com/a/34065445
# rewrite to HTTPS start
# If we receive a forwarded http request from a proxy...
#RewriteCond %{HTTP:X-Forwarded-Proto} =http [OR]
# ...or just a plain old http request directly from the client
#RewriteCond %{HTTP:X-Forwarded-Proto} =""
#RewriteCond %{HTTPS} !=on
# Redirect to https version
#RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
# rewrite to HTTPS end
# Handle Authorization Header
RewriteCond %{HTTP:Authorization} .
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
# Redirect Trailing Slashes If Not A Folder...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} (.+)/$
RewriteRule ^ %1 [L,R=301]
# Handle Front Controller...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]
</IfModule>
<FilesMatch "\.(ttf|otf|eot|woff|woff2)$">
<IfModule mod_headers.c>
Header set Access-Control-Allow-Origin "*"
</IfModule>
</FilesMatch>
AddType image/webp .webp
#php_flag expose_php Off
#php_value expose_php Off
php_value memory_limit 512M
php_value post_max_size 512M
php_value upload_max_filesize 512M
public / webpondemand. php
<?php
// To start with, lets display any errors.
// - this will reveal if you entered wrong paths
error_reporting(E_ALL);
ini_set('display_errors', 1);
// Once you got it working, make sure that PHP warnings are not send to the output
// - this will corrupt the image
// For example, you can do it by commenting out the lines below:
// error_reporting(0);
// ini_set("display_errors", 0);
require '../vendor/autoload.php'; // Make sure to point this correctly
use WebPConvert\WebPConvert;
$source = $_GET['source']; // Absolute file path to source file. Comes from the .htaccess
$destination = $source . '.webp'; // Store the converted images besides the original images (other options are available!)
$options = [
// UNCOMMENT NEXT LINE, WHEN YOU ARE UP AND RUNNING!
'show-report' => true // Show a conversion report instead of serving the converted image.
// More options available!
// https://github.com/rosell-dk/webp-convert/blob/master/docs/v2.0/converting/introduction-for-converting.md
// https://github.com/rosell-dk/webp-convert/blob/master/docs/v2.0/serving/introduction-for-serving.md
];
WebPConvert::serveConverted($source, $destination, $options);
Я использую rosell-dk / webp-convert для преобразования изображений в webp на лету. Это необходимо сделать на лету из-за требований клиента.
Пример URL-адреса изображения: https://www.example.com/storage/vacations/March2020/EBK2yfKf6pph0uCK90pO.jpg
Он работает на локальном хосте, но не на виртуальном хостинге. Если я получу прямой доступ к webpondemand. php и передам исходный параметр storage / vacations / March2020 / EBK2yfKf6pph0uCK90pO.jpg , он будет преобразован, но если я получу прямой доступ, то не получится. Очевидно, что это ошибка .htaccess, потому что если он перенаправляет на webpondemand. php, тогда этот файл преобразует его в webp, как это было в localhost. Но он не перенаправляет на webpondemand. php file.