Как фильтровать по URL-адресу запроса на HTTP-сервере Apache
Я хочу, чтобы между моим приложением и клиентом был http-сервер apache.
Параметр запроса должен быть передан при доступе клиентом. Например, если мой клиент работает в http://myhost:myport/myapp, доступ к нему должен осуществляться только путем передачи параметра myparam. Например, http://myhost:myport/myapp?myparam=123.
Итак, в моем http-сервере apache я хочу отфильтровать запросы, которые не содержат параметр запроса myparam.
Я пытался использовать фильтры. Он имеет несколько предопределенных фильтров, но ни один из фильтров не удовлетворяет моим требованиям. Я пытался использовать mod_ext_filter. Но, похоже, весь контент передается моей программе, а не URL. Так как мне нужно фильтровать на основе параметра, присутствующего в URL, я не думаю, что он удовлетворяет моим требованиям.
Есть ли какой-либо модуль http-сервера, который можно использовать для фильтрации по параметру, переданному в URL?
РЕДАКТИРОВАТЬ
Кроме того, мне нужно получить значение из параметра запроса и проверить его. Проверка является вызовом службы REST
1 ответ
В версии 2.4 вы можете сделать что-то простое:
<Location /myapp>
Require expr %{QUERY_STRING} =~ /myparam/
</location>
Вероятно, вы можете сделать это с помощью
Если у вас много пар myapp->myparam, вы можете перейти к старой школе mod_rewrite и сохранить их в основанной на 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->uri и r->args. Но вам нужен ваш собственный http-клиент для исходящего вызова REST - в ядре нет API для этого. - Ковенер 24 августа в 13:27