Использование Mod_Rewrite с параметрами URL-адреса изображения

#php #apache #.htaccess #mod-rewrite

#php #apache #.htaccess #mod-перезапись

Вопрос:

Я использую скрипт для создания водяных знаков на изображениях на лету через URL.

Например: http://example.com/watermark.php?filename=assets/img/temp/temp_share.jpg приведет к temp_share.jpg появлению водяного знака на новом изображении.

Я пытаюсь использовать mod_rewrite для очистки URL-адреса что-то вроде http://example.com/filename/assets/img/temp/temp_share.jpg

Я использовал генератор на этом сайте, и он дал мне RewriteRule ^filename/([^/]*)$ /watermark.php?filename=$1 [L] .

Но когда я пытаюсь перейти http://example.com/filename/assets/img/temp/temp_share.jpg , я получаю сообщение об ошибке Not Found The requested URL /filename/assets/img/temp/temp_share.jpg was not found on this server.

Я не уверен, что я сделал не так.

Полное содержимое my .htaccess

 ErrorDocument 400 /err.php?err=400
ErrorDocument 401 /err.php?err=401
ErrorDocument 403 /err.php?err=403
ErrorDocument 404 /err.php?err=404
ErrorDocument 500 /err.php?err=500
ErrorDocument 502 /err.php?err=502
ErrorDocument 504 /err.php?err=504

Options -MultiViews
RewriteEngine On
RewriteBase /

RewriteRule assets/styles/style.css assets/styles/style.php [L]
RewriteRule assets/styles/m.style.css assets/styles/m.style.php [L]

RewriteRule ^filename/([^/]*)$ /watermark.php?filename=$1 [L]

<FilesMatch ".(jpg|png|gif|jpeg)$">
ErrorDocument 404 error/stormtrooperBrokenImage.jpg
</FilesMatch>

<IfModule mod_headers.c>
    Header set Access-Control-Allow-Origin http://lucycypher.com  
    Header set Access-Control-Allow-Credentials true
</IfModule>
  

Содержимое watermark.php :

 $imgpath=$_REQUEST['filename'];
header('content-type: image/jpeg'); 
$watermarkfile="assets/img/logo_variations/logo_watermark_75.png";
$watermark = imagecreatefrompng($watermarkfile);
list($watermark_width,$watermark_height) = getimagesize($watermarkfile);
$image = imagecreatefromjpeg($imgpath);
$size = getimagesize($imgpath);
$dest_x = ($size[0] - $watermark_width)/2;
$dest_y = ($size[1] - $watermark_height)/2;
imagecopy($image, $watermark, $dest_x, $dest_y, 0, 0, $watermark_width, $watermark_height);
imagejpeg($image);
imagedestroy($image);
imagedestroy($watermark);
  

Ответ №1:

[^/] является символьным классом всех символов, кроме /

Поскольку имена ваших файлов содержат /, вам необходимо записать все символы после токена «filename/». Попробуйте изменить его на это.

 RewriteRule ^filename/(.*)$ /watermark.php?filename=$1 [L]
  

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

Вам также следует рассмотреть возможность добавления дополнительной проверки безопасности в пути к изображению. Кому-то очень легко манипулировать параметром filename с помощью таких вещей, как ../../../sensitive_uploads/1.jpg переход куда-то за пределы вашего каталога изображений.

Комментарии:

1. Я вижу. Итак, если я правильно понимаю, если бы я должен был поместить [^a] тогда, это был бы класс символов для всех символов, кроме a ?

2. Точно. Здесь больше информации см. Класс отрицательных символов.