2015-08-24 10 views
1

Я хочу иметь HTTP-сервер apache между моим приложением и клиентом.Как фильтровать на основе URL-адреса запроса в HTTP-сервере Apache

Параметр запроса должен быть передан при доступе клиентом. Например, если мой клиент работает в http://myhost:myport/myapp, тогда он должен быть доступен только путем передачи параметра myparam. Мне нравится http://myhost:myport/myapp?myparam=123.

Так что на моем http-сервере apache я хочу отфильтровать запросы, которые не содержат параметр запроса myparam.

Я пробовал использовать filters. Он имеет некоторые предопределенные фильтры, но ни один из фильтров не удовлетворяет моим требованиям. Я пробовал использовать mod_ext_filter. Но, кажется, весь контент передается моей программе, а не URL. Поскольку мне нужно фильтровать на основе параметра, присутствующего в URL-адресе, я не думаю, что он удовлетворяет моему требованию.

Есть ли какой-либо сервер http-модуля, который можно использовать для фильтрации на основе параметра, передаваемого по URL-адресу?

EDIT

Кроме того, мне нужно, чтобы получить значение из запроса и парам проверить его. Проверка представляет собой вызов REST службы

ответ

1

В 2.4 вы можете сделать что-то просто:

<Location /myapp> 
    Require expr %{QUERY_STRING} =~ /myparam/ 
</location> 

Вы, вероятно, может сделать это с <, если это > и захватами, но я не знаю, как вы можете получить он ищет «карту» корня контекста для запроса параметра.

Если у вас много пар myapp-> myparam, вы можете пойти в старую школу mod_rewrite и сохранить их в rewritemap на основе txt. Вот пример, который имеет несколько «интересных» переписать уловок, чтобы выполнить то, что вы описали:

RewriteMap foo txt:/tmp/rewrite.map 
RewriteEngine ON 
# Fancy way to check two variables are equal in a RewriteCond 
RewriteCond %{QUERY_STRING},${foo:$1} !^([^,]+),\1 
# grab the first segment 
RewriteRule ^/([^/]+)/ - [F] 

Но (если, как описано ниже в комментариях), необходимо извлечь карту из какого-то удаленного веб-сервиса вы необходимо будет реализовать модуль C или Lua внутри httpd. Трудная часть там становится получение удаленного ответа, остальные части тривиальны:

Вы можете написать свой собственный модуль access_checker, который находит r-> Ури r-> арг довольно легко. Но вам нужен ваш собственный клиент http, чтобы сделать исходящий вызов REST - для этого в ядре нет API. - covener 24 авг. В 13:27

+0

Пример повторной записи потребует адаптации, чтобы вытерпеть больше материала в строке запроса, прямо сейчас это точное совпадение. – covener

+0

Мне нужно получить значение из параметра запроса и проверить его. Валидация - это вызов службы REST. Как я могу это сделать? – sag

+0

yikes, время, чтобы купить книгу модулей Apache от Nick Kew. – covener