Mod-Rewrite

刪除 URL 上的雙重 URL 編碼

  • July 15, 2015

我在我的伺服器上設置了一個第三方購物車,使用 PayPal 進行付款。當使用者完成交易時,他們會被重定向到 URL https://example.com/?target=payment%255freturn&txn_id_name=txnId...。正確的 URL 應包括target=payment_returntarget=payment%5freturn。這些 URL 正常工作,向客戶展示他們的發票,但 PayPal 重定向到的 URL 被 URL 編碼兩次,因此給客戶一個 404 錯誤。

我無法更改應用程序的邏輯以接受兩次轉義的 URL,因此我一直在嘗試設置重定向以更正它。我使用 mod_alias 或 mod_rewrite 嘗試了以下多種變體:

RedirectMatch permanent (?i)^/\?target=payment%255freturn(.*) /target=payment_return$1

RewriteRule ^/\?target=payment%255freturn(.*) /target=payment_return$1 [NE]

我嘗試了 %255f、%5f 和 _ 的變體,並且嘗試了使用和不使用 NE 標誌。

如何讓使用者成功重定向到正確的 URL?

您可以嘗試使用腳本語言來解決此問題。例如,您可以執行以下操作:

RewriteEngine on
RewriteCond %{REQUEST_URI} ^/\?target=payment%255freturn.*
RewriteRule (.*) unescaper.php?url=$1 [L]

然後在 unescaper.php 中執行以下操作:

<?php
$decoded_url = rawurldecode($_GET['url']);
header('Location: ' . $decoded_url);
exit;

免責聲明:我沒有測試這個 .htaccess 或程式碼,但它應該讓你非常接近。如果rawurldecode不適合您的情況(但我認為是),請查看urldecode.

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