Как перенаправить все запросы в файл, кроме изображений с помощью 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
, если есть ссылки на изображения?
Дополнительная обратная связь по коду, который у меня уже есть, очень ценится!
Ответы
Ответ 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 исходному пути, переданному как параметр строки запроса, называемому" запрос ", добавив любые другие параметры строки запроса в новый запрос".