Как перенаправить все запросы в файл, кроме изображений с помощью Apache? - PullRequest
20 голосов
/ 15 августа 2011

У меня есть файл .htaccess со следующим содержимым:

Options +FollowSymLinks +ExecCGI

<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteRule ^(.*)$ entryPoint.php [QSA]
</IfModule>

При этом я хочу, чтобы все запросы были перенаправлены в файл entryPoint.php, чтобы он мог их просматривать:

  • Если расширение отсутствует, это должен быть модуль
  • Если есть .php, то это взлом
  • Если это .png, то это "безопасный" вызов.

    В случае изображений я использовал вывод заголовков, а file_get_contents() их содержимое. Я понял, что это немного медленнее, чем оставить прямое чтение.

Мой вопрос:

Как предотвратить этот .htaccess от вызова entryPoint.php, если есть ссылки на изображения?

Дополнительные отзывы о коде, который у меня уже есть, очень важны!

Ответы [ 3 ]

42 голосов
/ 15 августа 2011

Насколько я понимаю, вы хотите обработать все не изображения, бросил ваш php файл.Правильно?

Если это так, то вот что вам нужно:

Options +FollowSymLinks +ExecCGI

<IfModule mod_rewrite.c>

RewriteEngine On
RewriteCond %{REQUEST_URI}  !(\.png|\.jpg|\.gif|\.jpeg|\.bmp)$
RewriteRule (.*)  entryPoint.php [QSA]

</IfModule>

Не забудьте добавить, чтобы удалить любое расширение изображения, которое вы хотите!Если я неправильно понял, пожалуйста, скажите мне исправить мой ответ!

8 голосов
/ 15 августа 2011

Вы можете использовать что-то вроде этого, чтобы остановить перезапись изображений

RewriteRule \.(jpg|png)$ - [L]

Это правило гласит: «если запрошенный файл заканчивается точкой, за которой следует либо« jpg », либо« png », тогда не переписывайте его«.

Символ $ просто помечает «конец строки / имени файла», - говорит «не переписывать URL, если это правило соответствует», а [L] означает «не»не обрабатывать больше правил, если это соответствует.

Я добавлю, что обычный способ иметь дело с такого рода вещами состоит в том, чтобы просто применить общее утверждение "если этот файл существует, просто подайте файл напрямую, но все, что не существует, обрабатывается PHP. "Этот тип правила выглядит следующим образом:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?request=$1 [L,QSA]

Это говорит" если запрос не для файла или каталога, который существует, передайтезапрос к index.php с исходным путем, переданным в качестве параметра строки запроса, называемого «запрос», с добавлением любых других параметров строки запроса к новому запросу. "

7 голосов
/ 15 августа 2011
RewriteCond %{REQUEST_FILENAME} !\.(png|jpg|gif)$

Поместите эту строку прямо перед RewriteRule

...