Перезапись URL Apache без mod_rewrite

Я переношу фильтр IIS asapi на linux/apache, и мне интересно, как лучше всего его использовать. В IIS этот фильтр isapi перехватывает запрос, выполняет поиск в базе данных, чтобы найти файл, который запрашивает пользователь, а затем переписывает URL-адрес для непосредственного обслуживания этого файла.

Как лучше всего это сделать на Apache? mod_rewrite, похоже, не имеет возможности вставлять пользовательский код для выполнения поиска в базе данных, поэтому мы не можем его использовать. Мы не можем использовать mod_isapi, поскольку наша DLL является фильтром, а модуль его не поддерживает.

Прямо сейчас я думаю, что самый простой способ — это написать наш собственный модуль C, используя код mod_rewrite в качестве руководства. Я хотел бы избежать этого, если смогу. Я также не хочу выдавать перенаправление HTTP для каждого запроса через perl/PHP/любой сценарий, поскольку производительность будет страдать от перенаправления.

Предложения? Можем ли мы использовать обработчики или фильтры Apache для достижения этой цели?


person MonkeyWrench    schedule 04.01.2011    source источник


Ответы (1)


В mod_rewrite MapType "prg" предназначен именно для этого. Это позволяет вам использовать любой исполняемый файл в качестве вашей карты, все, что ваша программа должна сделать, это прочитать строки и вывести значение поиска.

http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html

person Zeki    schedule 04.01.2011
comment
Спасибо, я посмотрю на это. Знаете ли вы, есть ли какие-либо удары по производительности при использовании этого? Можно ли как-то кэшировать внешнее приложение? Я вижу, что ответы можно кешировать, но я не уверен, что это соответствует нашим потребностям или поможет нам. - person MonkeyWrench; 04.01.2011
comment
Внешнее приложение должно отвечать за собственное кэширование. Это может и действительно хорошо масштабируется, если ваше внешнее приложение может справиться с входящими запросами. - person Zeki; 04.01.2011
comment
Интересный. Загружается ли внешнее приложение в память для каждого запроса? Учитывая, что мы будем устанавливать соединение с базой данных, кажется, что было бы лучше, если бы оно было каким-то постоянным. - person MonkeyWrench; 05.01.2011
comment
Нет, внешнее приложение загружается один раз и используется всеми потоками. Поскольку он работает только в 1 потоке (по крайней мере, так было в версии 1.3), он должен быть очень быстрым и очень легким. Если вы собираетесь обращаться к базе данных, рассмотрите возможность использования локальной памяти для хранения самых популярных поисков трафика, чтобы сократить трафик базы данных. Вы также можете рассмотреть возможность использования memcached или чего-то еще в качестве среднего уровня, чтобы база данных не была затерта. - person Zeki; 05.01.2011
comment
Спасибо. Здесь нашел хороший пример: codemarvels.com/2010/11/ - person MonkeyWrench; 05.01.2011