Apache HTTPd 2.2 игнорирует регулярное выражение LocationMatch
Я пытаюсь создать обратный прокси, который соответствует каждому URL, кроме одного в Apache 2.2. Он работает на Apache 2.4 (Centos 7), но не на Apache 2.2 (Centos 6.6) ...
# Do not modify this
<LocationMatch "^/my-website-2">
ProxyPass http://X.X.X.X:PORT/my-website-2
ProxyPassReverse http://X.X.X.X:PORT/my-website-2
(...)
</LocationMatch>
# Match every URL except the one finishing with /redirect
<LocationMatch "^/my-website(?!/redirect)">
ProxyPass http://X.X.X.X:PORT/my-website
ProxyPassReverse http://X.X.X.X:PORT/my-website
AuthType XXX
RequestHeader set XXX YYY
(...)
</LocationMatch>
# Do anothers directives with this URL only, finishing with /redirect
<Location "/my-website/redirect">
AuthType XXX
(...)
</Location>
Мой сервер ищет /var/www/html/my-website (который не существует), когда я набираю https://my-server.com/my-website потому что регулярное выражение не соответствует ^/my-website(?!/ перенаправление)
Я знаю, что Apache 2.2 не понимает все отрицательные регулярные выражения PCRE, но кажется, что существуют некоторые хитрости... См.:
- Директива местоположения Apache - отрицательные комбинации PCRE (соответствуют всем, кроме..)
- https://stackoverflow.com/questions/3404037/how-to-make-a-regex-for-files-ending-in-php
- https://stackoverflow.com/questions/8545680/how-to-tell-apache-to-locationmatch-opposite-of-this
Затем я попробую простое регулярное выражение:
<LocationMatch "/my-website(.*)">
... и кажется, что это даже не интерпретируется как PCRE ... В этом случае использования, если я наберу /my-website(.*) в URL, это работает.
То же поведение с (из http://httpd.apache.org/docs/2.2/en//mod/core.html):
<LocationMatch "/(extra|special)/data">
... Мне нужно ввести http://my-server.com/(extra%7Cspecial)/data в адресной строке браузера.
Нужен ли Apache HTTPd 2.2 дополнительный пакет для понимания PCRE в LocationMatch?
Установленные пакеты:
httpd.x86_64 2.2.15-60.el6.centos.6
apr.x86_64 1.3.9-5.el6_9.1 @Default_Organization_CentOS_6_CentOS_6_Update_x86_64
apr-util.x86_64 1.3.9-3.el6_0.1 @in-std
pcre.x86_64 7.8-7.el6 @Default_Organization_CentOS_6_CentOS_6_Base_x86_64
pcre-devel.x86_64 7.8-7.el6 @Default_Organization_CentOS_6_CentOS_6_Base_x86_64
Странно...
Спасибо
1 ответ
Вам нужно использоватьProxyPassMatch
вместоProxyPass
.
Обновлено из вашего примера выше, с другими важными изменениями:
# Do not modify this
<LocationMatch "^/my-website-2">
ProxyPassMatch http://X.X.X.X:PORT
ProxyPassReverse http://X.X.X.X:PORT
(...)
</LocationMatch>
# Match every URL except the one finishing with /redirect
<LocationMatch "^/my-website(?!/redirect)">
ProxyPassMatch http://X.X.X.X:PORT
ProxyPassReverse http://X.X.X.X:PORT
AuthType XXX
RequestHeader set XXX YYY
(...)
</LocationMatch>
# Do anothers directives with this URL only, finishing with /redirect
<Location "/my-website/redirect">
AuthType XXX
ProxyPassMatch http://X.X.X.X:PORT
ProxyPassReverse http://X.X.X.X:PORT
(...)
</Location>