2017-04-02 34 views
6

在我的asp.net核心應用(角4前端)我接受這樣的URL:重寫正斜槓中的查詢參數

example.com/report;url=http%3A%2F%2Fexample2.com 

我想創建一個允許人們進入一個重寫規則以下網址:

example.com/report;url=http://example2.com 

我找不出如何做到這一點。

我想:

var options = new RewriteOptions() 
    .AddRewrite(@"(.*);url=http:\/\/([^;]*)(.*)", "$1;url=http%3A%2F%2F$2$3", skipRemainingRules: false) 
    .AddRewrite(@"^report.*", "index.html", skipRemainingRules: true) 

app.UseRewriter(options); 

這沒有工作,但即使它不會考慮該域名,有斜線的網址,即子目錄。使用組匹配模式我認爲這是不可能的。它需要在匹配組上找到&替換類型的操作。

其他網絡服務器將此作爲可配置選項來解碼斜槓。我無法在asp.net核心文檔中找到任何對它的引用。這可能嗎?

+0

的價值。網絡核心應用程序和互聯網。我爲此使用了Nginx。你有沒有試圖在那裏重寫?我認爲它應該工作。順便說一下,使用目錄作爲別的東西不是一個好主意,除非它們與你的MVC結構相關,但是你不會使用重寫,你可以將模式匹配到控制器(或者對於簡單的CMS,使用1個控制器來匹配所有東西然後處理控制器中的URL-s)。如果使用MVC,您可以在需要時返回「重定向」響應。 – Harry

+0

你在哪裏舉辦你的應用程序? IIS,nginx,自託管? – Evk

+5

爲什麼不能使用查詢字符串來實際保存參數,即使用'?'並將您的URL更改爲'example.com/report?url = http:// example2.com'?然後你可能根本不需要重寫任何URL。 – SergGr

回答

0

您將要傳遞該網址的參數。通過允許用戶在地址欄中輸入URL作爲參數,確實無法獲得您想要的內容。它總是需要被編碼。

相反的:

http://example.com/report;url=http%3A%2F%2Fexample2.com 

使用:

http://example.com/report?url=http%3A%2F%2Fexample2.com 

而不是讓用戶輸入這一切到瀏覽器地址欄,我反而會創建一個用戶界面,允許用戶請求報告並點擊提交。該報告需要一個用於該URL的文本框,並且在將URL文本框的內容編碼到「url」參數後,它會向您的網站發送一個獲取請求。

使用一個URL重寫模塊可能在這裏反對穀物。

+0

一樣,我當然在我的應用程序中傳遞了這些參數。這不是問題。在其他網絡服務器中,可以解碼URL中的斜槓以允許我請求的鏈接。我的問題是關於如何在kestrel/asp.net核心中做到這一點。 – Guerrilla

+0

我正在使用角度路由,所以我需要使用矩陣查詢參數樣式 – Guerrilla

0

不幸的是,基於RewriteRule類的代碼,這是不可能的。您應該可以創建自己的自定義重寫規則,儘管它將實現IRule接口和URL請求路徑的一部分。

的重寫規則的源代碼可以在這裏找到 https://github.com/aspnet/BasicMiddleware/blob/dev/src/Microsoft.AspNetCore.Rewrite/Internal/RewriteRule.cs

這裏是URLEncoder的給據我所知,你必須使用你之間的反向代理編碼「網址」 https://github.com/dotnet/corefx/blob/master/src/System.Text.Encodings.Web/src/System/Text/Encodings/Web/UrlEncoder.cs