Использование htaccess для проверки файла в другом каталоге - PullRequest
1 голос
/ 11 июля 2011

Хорошо, я начинаю задумываться, возможно ли это вообще. Я поливал учебники и примеры по htaccess, и мне просто не удается заставить его работать правильно.

У меня есть скрипт, который создает динамические изображения, работающие в каталоге на сайте друзей. У меня есть доступ к /, но фактический каталог, который я использую, находится в / mydir /. Для отображения изображений они выводятся в png через PHP. У меня есть следующие настройки RewriteRule , чтобы взять запрошенное имя файла и запустить скрипт PHP. Каждое имя файла представляет собой отдельный файл с сериализованным объектом, который используется в скрипте display.php

RewriteRule ^(.*)\.jpg$ display.php?file=$1

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

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

Я пробовал такие вещи, как

RewriteCond %{REQUEST_URI} ^(.*)\.jpg$
RewriteCond %{DOCUMENT ROOT}/img/Cache/%1.jpg -f

и другие комбинации REQUEST_URI, REQUEST_URL, SCRIPT_FILENAME, SCRIPT_NAME и т. Д. Я не могу придумать правильную переменную и выражение регулярного выражения, чтобы справиться с этим, поэтому я обращаюсь к вам, ребята, за помощью. Самая большая проблема - не знать, что на самом деле находится в каждой из этих переменных, чтобы я мог видеть, где я иду не так. Я бы убил за какой-то var_dump (),

Ответы [ 2 ]

1 голос
/ 11 июля 2011

Используйте это правило:

Options +FollowSymLinks
RewriteEngine On

RewriteCond %{DOCUMENT_ROOT}/mydir/img/Cache/$1.jpg -f
RewriteRule ^(.*)\.jpg$ display.php?file=$1 [L]
  1. Это необходимо поместить в файл .htaccess в папке /mydir/img

  2. Если вы переместите эту папку в другое место или переименуете родительскую папку, вам также потребуется обновить ее в строке RewriteCond.


Если вы хотите попробовать этот подход, который является более гибким (не нужно указывать имена родительских папок), но я не могу гарантировать, что это будет работать в ваших настройках (но это работает на моем ПК):

Options +FollowSymLinks
RewriteEngine On

RewriteCond %{REQUEST_FILENAME} ^(.*)/([^/]+)\.jpg$
RewriteCond %1/Cache/%2.jpg -f
RewriteRule ^(.*)\.jpg display.php?file=$1 [L]

Здесь текущая физическая папка определяется автоматически по запрошенному URL. Но если у вас есть символические ссылки или другие настройки, это может привести к неверным результатам. Плюс .. у него есть еще 1 Условие ... что делает его немного медленнее (1 дополнительное регулярное выражение для проверки).

0 голосов
/ 11 июля 2011

Я бы использовал файл PHP, чтобы проверить это:

используйте file_exists в вашем PHP и, если он не существует, используйте header("HTTP/1.0 404 Not Found"); или header('Location для изображения 404

...