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

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


person user893856    schedule 15.08.2011    source источник


Ответы (3)


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

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

Options +FollowSymLinks +ExecCGI

<IfModule mod_rewrite.c>

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

</IfModule>

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

person undone    schedule 15.08.2011
comment
нет, я хочу обработать все через этот файл, КРОМЕ изображений :) - person user893856; 15.08.2011
comment
правильно, теперь это работает, но в чем разница между: RewriteRule (.*) entryPoint.php [QSA] и RewriteRule ^(.*)$ entryPoint.php [QSA] - person user893856; 15.08.2011
comment
@user893856 user893856 ничем не отличается, потому что оба переписывают весь путь! - person undone; 15.08.2011
comment
новый вопрос: может кто-нибудь сказать мне, куда положить этот файл? в корне документа? - person philx_x; 15.01.2016
comment
@philx_x Да, это сработает. - person undone; 15.01.2016
comment
Я бы добавил CSS и JS, чтобы некоторые таблицы стилей и javascript работали на странице обслуживания: RewriteCond %{REQUEST_URI} !(\.png|\.jpg|\.gif|\.jpeg|\.bmp|\.css|\.js)$ - person loretoparisi; 27.02.2016

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

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

person AgentConundrum    schedule 15.08.2011
comment
Не забывайте RewriteCond %{REQUEST_FILENAME} !-l для символических ссылок - person Phil; 15.08.2011

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

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

person zerkms    schedule 15.08.2011