Задать вопрос
@ugodrus

Apache 2.4 mod_rewrite почему не работает проверка на наличие файла?

Столкнулся со странной проблемой.

Есть .htaccess со следующим содержимым:

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} ^/([^/]+)/thumb/([^/]+)(/.+)?/(.+)\.(jpe?g|png|gif|svgz?|tiff?)$
RewriteCond %{DOCUMENT_ROOT}/assets/thumbs/thumb.inc/%2.inc.php –f 
RewriteCond %{DOCUMENT_ROOT}/%1%3/%4.%5 –f
RewriteRule ^(.*)$ assets/thumbs/thumb.php [L,QSA]

На многих серверах такие конструкции использовал и всё работало.
Если коротко описать действие директив:

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

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

Мозг сломан. Жду помощи.
  • Вопрос задан
  • 708 просмотров
Подписаться 1 Оценить Комментировать
Решения вопроса 1
@ugodrus Автор вопроса
В том то и прикол. После первых 2х строк шлю в назначенный php с добавлением подстановок из не срабатывающих правил в query string.. в скрипт приходят живые абсолютные маршруты. Причем -f работает с абсолютными маршрутами но не срабатывает..

UPDATE

Ответ на вопрос оказался довольно простым: закрались опечатки точнее кривые символы визуально не очень заметные.
И может быть давно бы эту проблему решил если бы Apache 2.2 смог мне ее показать в RewriteLog.
Косяк был замечен после того, как перешел на 2.4 и попытки запустить RewriteLog. Самое весёлое что до этого в логе эти опечатки не упоминались.
А всё оказалось слишком просто.
RewriteEngine On

RewriteBase /

# Если нет запрашиваемого файла
RewriteCond %{REQUEST_FILENAME} !-f

# Если URI к нему соответствует шаблону
RewriteCond %{REQUEST_URI} ^/([^/]+)/thumb/([^/]+)(/.+)?/(.+)\.(jpe?g|png|gif|svgz?|tiff?)$

# Если представлен файл оригинального изображения и полностью соответствуют имя и расширение
RewriteCond %{DOCUMENT_ROOT}/%1%3/%4.%5 -f

# Или представлен файл оригинального изображения с таким же именем но с другим расширением
#RewriteCond %{DOCUMENT_ROOT}/%1%3/%4.jpg  -f [OR]
#RewriteCond %{DOCUMENT_ROOT}/%1%3/%4.jpeg -f [OR]
#RewriteCond %{DOCUMENT_ROOT}/%1%3/%4.tif  -f [OR]
#RewriteCond %{DOCUMENT_ROOT}/%1%3/%4.tiff -f [OR]
#RewriteCond %{DOCUMENT_ROOT}/%1%3/%4.gif  -f [OR]
#RewriteCond %{DOCUMENT_ROOT}/%1%3/%4.bmp  -f [OR]
#RewriteCond %{DOCUMENT_ROOT}/%1%3/%4.png  -f [OR]
#RewriteCond %{DOCUMENT_ROOT}/%1%3/%4.svg  -f [OR]
#RewriteCond %{DOCUMENT_ROOT}/%1%3/%4.svgz -f

# А также имеется правило преобразования для миниатюризатора в виде php файла в указанной директории
RewriteCond %{DOCUMENT_ROOT}/assets/thumbs/thumb.inc/%2.inc.php -f 

RewriteRule ^(.*)$ assets/thumbs/thumb.php [L,QSA]

Пользуйтесь на здоровьице. И будьте ВНИМАТЕЛЬНЕЕ К МЕЛОЧАМ.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
shambler81
@shambler81 Куратор тега htaccess
RewriteCond %{REQUEST_URI} ^/([^/]+)/thumb/([^/]+)(/.+)?/(.+)\.(jpe?g|png|gif|svgz?|tiff?)$ - точно работает ?

может так
RewriteCond %{REQUEST_URI} ^([^/]+)/thumb/([^/]+)(/.+)?/(.+)\.(jpe?g|png|gif|svgz?|tiff?)$

Да и вообще у тебя чет многовато начала строк

Дай лучше список реальных ссылок покрасивше сделаем.
Ответ написан
Комментировать
@litvinenkow
может nginx статику отдаёт и не позволяет даже сработать апачу в этом случае, сам с подобным столкнулся, вот сейчас думаю как быть
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы