Обновить ваш .htaccess RewriteRule
передать совпадающее имя файла в PHP скрипт следующим образом (ваш RewriteCondition излишен):
RewriteEngine On
RewriteRule ^((.*)\.jpg)$ /protect.php/$1
Затем вы можете получить доступ к значению проходит с использованием $_SERVER['PATH_INFO']
или $_SERVER['PATH_TRANSLATED']
(то Apache пытается сопоставить его с реальным путем в соответствии с корнем документа, см. mod_cgi и RFC 3875 для получения дополнительной информации). Для этого необходимо активировать AcceptPathInfo
в Apache httpd (по умолчанию).
или использовать
RewriteRule ^((.*)\.jpg)$ /protect.php?filename=$1
и использовать $_GET['filename']
. Особенно здесь, остерегайтесь атак на обход каталога (например, кто-то использует /protect.php?filename=../../someother-file.jpg
). Обычно я использую realpath
, чтобы нормализовать путь и проверить, что он начинается с папки, содержащей файлы или корень документа ($_SERVER['DOCUMENT_ROOT']
).
В обоих случаях также убедитесь, что вы доставляете разрешенные файлы (например, что происходит, если злоумышленник использует /protect.php/protect.php
). Это может привести к утечке конфиденциальных данных.
PS: Возможно, вы также захотите сделать ответ не кешируемым или предоставить Content-Length.
PSS: Даже для запрещенного случая вам также необходимо предоставить правильный Content-Type - или использовать перенаправление (header('Status: 302');
и header("Location: https://placeholdit.imgix.net/~text?txtsize=38&txt=Forbidden&w=400&h=400");
), так что вам не нужно повторно запрашивать это изображение снова и снова.
Вы не должны обновлять вопрос, чтобы содержать решение. – MrTux