Apache-2.4

如何訪問由表達式中的重寫規則設置的環境變數?

  • January 4, 2019

我正在開發一個包含公共和私有部分的 Symfony 3.4 應用程序。但是,我目前正在為這個應用程序設置一個只能由授權使用者訪問的登台系統,所以我在整個應用程序前面放置了一個 .htaccess 基本身份驗證。

應用程序中有一條路由需要由不提供身份驗證的外部應用程序訪問。我只想為這個單一路由禁用 .htaccess 身份驗證。此路由的所有 URL 都採用任意 ID/api/post-result/123的形式。123

在搜尋了一下之後,我嘗試通過Require expr我的 .htaccess 中的一個條目來解決這個問題,該條目將簡單地匹配 URL。然而,由於 Symfony 進行 URL 重寫,REQUEST_URI對於伺服器(和我的情況)總是顯示為“app.php”。我嘗試了其他變數,例如QUERY_STRINGor PATH_INFO,但它們似乎都不包含我的實際請求 URI。然後我嘗試使用重寫規則將匹配的 URI 放入環境變數中。但是,似乎無法通過表達式讀取。

這是我的 .htaccess 文件

DirectoryIndex app.php

<IfModule mod_rewrite.c>
   RewriteEngine On

   RewriteCond %{REQUEST_URI}::$1 ^(/.+)/(.*)::\2$
   RewriteRule ^(.*) - [E=BASE:%1]

   RewriteCond %{ENV:REDIRECT_STATUS} ^$
   RewriteRule ^app\.php(/(.*)|$) %{ENV:BASE}/$2 [R=301,L]

   RewriteCond %{REQUEST_FILENAME} -f
   RewriteRule .? - [L]

   RewriteRule ^(.*)$ %{ENV:BASE}/app.php [L,E=SFURI:$1] # <-- env variable is set here
</IfModule>

<IfModule !mod_rewrite.c>
   <IfModule mod_alias.c>
       RedirectMatch 302 ^/$ /app.php/
   </IfModule>
</IfModule>

<Files "*.php">
 AuthUserFile /srv/my/app/.htuser
 AuthName "Authentication Required"
 AuthType Basic

 # allow access to post-result api without authentication
 # THIS DOES NOT WORK as reqenv('SFURI') is always empty
 Require expr "reqenv('SFURI') =~ m#/api/post-result/.*$#"
 # require authentication for everything else
 Require valid-user
</Files>

查看Apache日誌,環境變數設置正確:

$$ rewrite:trace5 $$ $$ pid 11010 $$mod_rewrite.c(476):$$ … $$將環境變數“SFURI”設置為“api/post-result/123” $$ rewrite:trace1 $$ $$ pid 12755 $$mod_rewrite.c(476):$$ … $$使用 /app.php 進行內部重定向$$ INTERNAL REDIRECT $$

但是,由於某種原因,當我稍後嘗試訪問它時,該變數為空。是否有可能在最後一個重寫規則引起的內部重定向上清除所有環境變數?日誌顯示條件不匹配,當我更改條件以檢查變數是否為空時,條件返回為真。我也嘗試過使用該env函式而不是reqenv,但行為是相同的。

$$ authz_core:trace4 $$ $$ pid 11010 $$util_expr_eval.c(860):$$ … $$ 來自 /srv/my/app/.htaccess:36 的表達式評估:0 $$ authz_core:debug $$ $$ pid 11010 $$mod_authz_core.c(809):$$ … $$AH01626: Require expr “reqenv(‘SFURI’) =~ m#/api/post-result/.*$#” 的授權結果: denied

我該怎麼做才能讓我的表達式找到重寫規則設置的環境變數?

事實證明,最後一個重寫規則導致的內部重定向在所有變數前面加上REDIRECT_. 為了訪問表達式中的變數,需要以REDIRECT_SFURI.

StackOverflow 中也提到了這個問題:在 Apache RewriteRule 指令中設置環境變數時,是什麼導致變數名稱以“REDIRECT_”為前綴?

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