我目前正在尝试通过代理或基于 cookie 向 PHP 文件发送请求。该规则仅适用于/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
。我错过了什么?
答案1
# 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]
第一个条件只有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 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]
除了不做评论声明,当请求发生以下情况时,它将重写 URL:不是启动/api
并且未设置 cookie。如果设置了 cookie 会怎么样?这也不会重写对根目录本身的请求 - 如果 DirectoryIndex 已正确设置,这可能是故意的?