Apache-2.4

使用 mod_rewrite - htaccess - regex 解碼重寫的 URL

  • February 27, 2019

我正在使用 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
  1. 第一個RewriteRule 內部將請求重寫為(仍在您的伺服器上):
/redirect/forms%2Fd%2Fe%2F1234567890%2Fviewform

AllowEncodedSlashes On由於您在伺服器配置中設置的指令,這是“允許的”(並且不會觸發 404) 。 2. 然後,第二個RewriteRule解碼 URL 路徑 ( %2Fto /) 並發出外部重定向到:

https://docs.google.com/forms/d/e/1234567890/viewform

RewriteRule 在應用模式之前,Apache 會自動對 URL 路徑進行 URL 解碼。相關部分被擷取並傳遞給反向引用中的替換$1

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