簡體   English   中英

如何允許URL在ASP.NET MVC5中包含點?

[英]How to allow URLs to contain dots in ASP.NET MVC5?

我正在開發一個應該允許URL中的點的網站,例如www.mysite.com/somedata/my.name-123 我希望的行為是使該網址相當於www.mysite.com/somedata/myname-123 ,但我得到404錯誤,因為這些點使IIS嘗試查找靜態文件。 類似的問題可以在這里找到,但是我提出的解決方案並不適用,正如我在下面解釋的那樣。 這是我嘗試過的:

  • 添加舊問題接受的答案中建議的新處理程序不起作用,因為我需要將其用於多個路徑。 如果我設置path =“*”,那么所有靜態文件(例如.css文件)都會失敗。 我可以使用RegEx指定一個url模式,但據我所知,path屬性不允許它(只允許使用通配符)

  • 使用<httpRuntime relaxedUrlToFileSystemMapping="true" /><requestFiltering allowDoubleEscaping="true"/>到web.config只是在MVC5中不起作用。

  • <modules runAllManagedModulesForAllRequests="true">到web.config中的system.webServer部分確實可以正常工作但是由於本文中公開的許多原因而不鼓勵這種做法,所以我盡量避免這種方法。

  • 在URL上附加一個斜杠(/)也可以解決問題,但這樣做會導致Google認為我正在提供重復內容,因此我無法使用此解決方案。

我想不出任何其他選擇。 理想情況下,我想添加一個新的處理程序,使其適用於所有URL,但以某些模式(.css,.js)結尾的URL除外。


更新:我找到了一個適合我的解決方案。 我會嘗試解釋我采取的步驟:

首先,我找到了一個非常好的解釋為什么會發生這種行為: Scott Forsyth的博客 還討論了上面列出的一些解決方案。 在對文章進行評論之后,我決定使用重寫規則處理虛線網址。 我決定在沒有麻煩的點的情況下提供URL,然后檢查用戶在我的應用程序的控制器中查找的內容,而不是添加尾部斜杠。 我的基本規則如下:

<rule name="remove troublesome dots" stopProcessing="false">
    <match url="^(.*)\.(\S*)$" />
    <conditions>
        <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
        <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
    </conditions>
    <action type="Rewrite" url="{R:1}{R:2}" />
</rule>

請注意,每次刪除一個點,因此具有多個點的URL會多次觸及此規則。 如果網址可能包含大量點,則這很糟糕。

如果靜態文件路徑沒有直接映射它的磁盤位置,我的方法將使它崩潰。 為了避免出現問題,我們需要為我們需要的文件結尾添加刪除點規則的例外。 Seb Nilsson 在本博文中解釋了如何在“為特定文件結尾添加條件”部分下執行此操作。

我記得幾個月前面對這種情況。 我真的很匆忙,所以我所做的可能不是推薦的方法。

我只指定了一個段 ,然后創建了適當的正則表達式作為約束

例如,它最終會是這樣的:

urlsomedata/{dotted}

約束dotted: "(.*\\.)*.*"

該正則表達式非常通用,您應該將其重新構造為僅接受受支持的字符 ,以避免無效符號。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM