使用 mod_rewrite - htaccess - regex 解碼重寫的 URL
我正在使用 Apache 2.4。我已經設置並配置了一個 Apache HTTP 伺服器來託管我的 invision 應用程序,我的應用程序連結到外部Google文件。我正在嘗試從應用程序重定向到外部Google文件,但 Apache 不喜歡它。
這是它嘗試訪問的 URL
http://example.com/redirect? url=https%3A%2F%2Fdocs.google.com%2Fforms%2Fd%2Fe%2F1234567890%2Fviewform
我已經使用以下內容重寫了 URL:
RewriteCond %{QUERY_STRING} ^(.+)(forms.+) RewriteRule ^redirect(.*) https://docs.google.com/%2 [R=302,QSD]
重寫後,我只剩下這個了。
https://docs.google.com/forms%2Fd%2Fe%2F12345678900%Fviewform
這完成了它應該做的事情,如果我個人將 %2F 替換為 ‘/’ 它會將我帶到文件中,所以我知道它很接近。URL 重定向到Google驅動器,只有我得到一個
404頁面不存在
來自Google驅動器的消息。我知道我需要解碼 URL 才能成功訪問文件,但是如何使用 .htaccess 或任何其他方式執行此操作?
AllowEncodedSlahes on (I have also tried NoDecode) //VirtualHost conf and apache conf
我嘗試使用 Regex 匹配和替換 %2F,但它們無法辨識,並且我得到 500 - Internal Server Error。
我知道這似乎是一個持續存在的錯誤/問題,但有沒有人能解決這個令人難以置信的痛苦問題?我對此束手無策,謝謝。
重寫後,我只剩下這個了。
https://docs.google.com/forms%2Fd%2Fe%2F12345678900%Fviewform
儘管您發布的指令不會發生這種情況,除非您還在指令中包含
NE
(noescape
) 標誌RewriteRule
。(相反,它將被雙重編碼)。使用該NE
標誌是朝著正確方向邁出的一步,但是,我們需要另一個步驟來對生成的 URL 路徑進行 URL 解碼……*旁注:*您在上面發布的結果 URL 路徑有一個錯字(給定您的範例輸入 URL)。決賽
%2F
不見了;相反,你有0%F
. 它應該是:forms%2Fd%2Fe%2F1234567890%2Fviewform
由於 URL 路徑中的編碼斜杠(如您所建議的那樣),Google 似乎會觸發 404,就像 Apache 預設情況下所做的那樣。設置
AllowEncodedSlashes On
(在 vHost 中)不會立即對此有所幫助,因為 404 是由 Google 觸發的。但是,這確實需要設置,以便我們可以在發出最終重定向之前進一步處理 URL 並取消編碼已編碼的斜杠。請嘗試以下操作:
# Set in your vhost (server config) AllowEncodedSlashes On
然後,在
.htaccess
(或適當的<Directory>
部分):RewriteEngine On RewriteCond %{QUERY_STRING} ^(.+)(forms.+) RewriteRule ^redirect$ /redirect/%2 [NE,QSD] RewriteRule ^redirect/(.+) https://docs.google.com/$1 [R=302,L]
因此,給您的伺服器的初始請求:
/redirect?url=https%3A%2F%2Fdocs.google.com%2Fforms%2Fd%2Fe%2F1234567890%2Fviewform
- 第一個
RewriteRule
內部將請求重寫為(仍在您的伺服器上):/redirect/forms%2Fd%2Fe%2F1234567890%2Fviewform
AllowEncodedSlashes On
由於您在伺服器配置中設置的指令,這是“允許的”(並且不會觸發 404) 。 2. 然後,第二個RewriteRule
解碼 URL 路徑 (%2F
to/
) 並發出外部重定向到:https://docs.google.com/forms/d/e/1234567890/viewform
RewriteRule
在應用模式之前,Apache 會自動對 URL 路徑進行 URL 解碼。相關部分被擷取並傳遞給反向引用中的替換$1
。