Вы сказали, что "написали это в конце моего .htaccess" .TBH Я не вижу способа, как это правило должно быть достигнуто ( порядок правил имеет значение ) без изменения некоторых других правил (например, удаление флага L
).
Давайте рассмотрим этот запрос: /gallery/segway/child-on-a-segway.jpg
.
Это будет переписано в /public/gallery/segway/child-on-a-segway.jpg
по этому правилу: RewriteRule ^(.*)$ /public/$1
Поскольку такого файла нет, он будет переписан в /public/index.php
по этому правилу: RewriteRule ^public/.*$ /public/index.php [NC,L]
.Из-за [L]
перезапись флага переходит к следующей итерации.
На 2-й итерации перезаписи это правило RewriteRule ^.*$ - [NC,L]
видит, что /public/index.php
существует, и прекращает любые дальнейшие перезаписи.
Учитывая все вышеизложенное, становится очевидным, что такое дополнительное правило необходимо поместить где-то посередине, не изменяя ни одно из существующих правил.Это правило, которое я придумаю, соответствует вашим требованиям (на основе вашей попытки переписать):
RewriteCond %{REQUEST_URI} !^/(public|img|js|css)/.*$
RewriteCond %{DOCUMENT_ROOT}/public/upload%{REQUEST_URI} -f
RewriteRule ^(.+\.(jpg|png|mp3))$ /public/upload%{REQUEST_URI} [NC,L]
Правильное место для его размещения, по моему мнению, было бы до этого правила: RewriteRule ^(.*)$ /public/$1
,Такой .htaccess будет иметь следующее содержимое:
RewriteEngine On
RewriteRule ^\.htaccess$ - [F]
RewriteCond %{REQUEST_URI} =""
RewriteRule ^.*$ /public/index.php [NC,L]
RewriteCond %{REQUEST_URI} !^/(public|img|js|css)/.*$
RewriteCond %{DOCUMENT_ROOT}/public/upload%{REQUEST_URI} -f
RewriteRule ^(.+\.(jpg|png|mp3))$ /public/upload%{REQUEST_URI} [NC,L]
RewriteCond %{REQUEST_URI} !^/public/.*$
RewriteRule ^(.*)$ /public/$1
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^.*$ - [NC,L]
RewriteRule ^public/.*$ /public/index.php [NC,L]
Я проверил - все работает.Это может быть не самым оптимальным, так как поиск файла выполняется (-f
), но, учитывая, что он будет работать только для ограниченного числа расширений (это хорошее требование), все должно быть хорошо (если это будет для КАЖДОГО расширения, тоэто замедлит работу системы на занятом сервере / под нагрузкой).
PS Как я понимаю, шаблон (?<
означает «просмотр переменной длины» (хотя я не на 100%уверен в этом).