Подтвердить что ты не робот

Как перенаправить все запросы в файл, кроме изображений с помощью Apache?

У меня есть файл .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, если есть ссылки на изображения?

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

4b9b3361

Ответ 1

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

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

Options +FollowSymLinks +ExecCGI

<IfModule mod_rewrite.c>

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

</IfModule>

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

Ответ 2

RewriteCond %{REQUEST_FILENAME} !\.(png|jpg|gif)$

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

Ответ 3

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

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 исходному пути, переданному как параметр строки запроса, называемому" запрос ", добавив любые другие параметры строки запроса в новый запрос".