Apache-2.4

如果設置了 cookie 並且僅用於子目錄,則使用代理或重定向到文件

  • April 24, 2020

我目前正在嘗試通過代理或基於 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. 我錯過了什麼?

# 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以開頭時才成功。但是,這種情況似乎是多餘的,因為您可以在指令本身中執行相同的檢查,該指令目前匹配all/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]

除了不按照評論所述進行操作外,這還會在請求**未啟動/api且未設置 cookie時重寫 URL 。如果設置了 cookie 怎麼辦?這也不會重寫對根目錄本身的請求 - 如果 DirectoryIndex 已經正確設置,這可能是故意的?

引用自:https://serverfault.com/questions/1013923