В настоящее время я пытаюсь отправить запрос либо через прокси, либо в файл PHP на основе cookie. Правило применяется только к / api
.
Это то, что у меня есть. Это часть моей конфигурации VirtualHost:
RewriteEngine on
# Cookie is not set. Send all request from /api/$ to local-file.php
RewriteCond %{REQUEST_URI} !^/api(/.*|)$ [NC]
RewriteCond %{HTTP_COOKIE} !\bexample_cookie=true\b
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /local-php.php [L]
# Cookie is set. Send all request to the proxy.
RewriteCond %{REQUEST_URI} !^/api(/.*|)$ [NC]
RewriteCond %{HTTP_COOKIE} \bexample_cookie=true\b
RewriteRule ^/(.*)$ http://proxy-domain.local/$1 [P,L]
ProxyPassReverse /api http://proxy-domain.local
Мои запросы теперь маршрутизируются правильно на основе cookie. Но, к сожалению, это глобально, и не только если путь начинается с / api
. Что я пропустил?
# Cookie установлен. Отправить все запросы на прокси. RewriteCond %{REQUEST_URI} !^/api(/.*|)$ [NC] RewriteCond %{HTTP_COOKIE} \bexample_cookie=true\b RewriteRule ^/(.*)$ http://proxy-domain.local/$1 [P,L]
Первое условие выполняется только тогда, когда REQUEST_URI
не не начинается с /api
.Однако это условие казалось бы избыточным, поскольку такую же проверку можно выполнить и в самой директиве RewriteRule
, которая на данный момент соответствует всем.
Например:
# Cookie is set. Send all request to the proxy.
RewriteCond %{HTTP_COOKIE} \bexample_cookie=true\b
RewriteRule ^/api/(.*)$ http://proxy-domain.local/$1 [P,L]
Обратите внимание, что для этого запрос должен начинаться как минимум с /api/
, а не /api
. Это нормально?
Тем не менее, я также усомнится в логике первого блока правил:
# Cookie не установлен. Отправить весь запрос из /api/$ в local-file.php RewriteCond %{REQUEST_URI} !^/api(/.*|)$ [NC] RewriteCond %{HTTP_COOKIE} !\bexample_cookie=true\b RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d Правило перезаписи. /local-php.php [L]
Помимо того, что не выполняется комментарий, URL-адрес перезаписывается, когда запрос не запускается /api
И файл cookie не установлен. Что делать, если файл cookie установлен? Это также не приведет к перезаписи запроса для самого корневого каталога — что может быть сделано намеренно, если DirectoryIndex уже установлен правильно?