ASP.Net URL 编码

2024-02-18

我正在 ASP.net 中实现 URL 重写,但我的 URL 给我带来了很多问题。

URL 是根据部门和类别的数据库生成的。我希望员工能够使用任何合适的特殊字符将项目添加到数据库中,而不会破坏网站。

我在构建 URL 之前对数据进行编码。

有几个问题...

  1. IIS 在 URL 到达 .net 之前对其进行解码,从而无法正确解析其中包含“/”的任何内容。
  2. ASP.net 对 url 感到困惑,使得“~”在某些页面中毫无用处
  3. 我从内置测试服务器迁移到本地 IIS 服务器(XP 计算机),任何包含编码 & (%26) 的 URL 都会出现“错误请求”错误。
  4. UrlEncode 保留一些中断字符不变,例如“.”

我确实有关于这个主题的另外两篇相关帖子,当时我只看到了小问题,没有看到上游的大问题。我发现了一些注册表技巧来解决“错误请求”问题,但我将部署到共享托管环境,从而使其毫无用处。我还知道这是对某些安全问题的修复,因此我不想在不知道我正在打开什么蠕虫的情况下绕过它。

我不想尝试强制 .net 向我传递原始 url,或覆盖 IIS 设置,而是首先制作真正安全的 URL。

我会注意到我已经尝试过 AntiXss.URLEncode、HttpUtility.URLEncode、URI.EscapeDataString。我什至尝试过像双 URLEncodng 这样愚蠢的事情。是否有一个实用程序可以满足我的需要,或者我真的需要自己推出。我什至正在考虑做一些 Hacky 的事情,比如用不寻常的字符串替换 % 。最终结果至少应该是可读的,这是使用 URL 重写的首要目的。

抱歉发了这么长的帖子——我只是想确保我已经包含了所有必要的细节。我似乎找不到任何相关信息,这似乎是一个常见问题 - 所以也许我错过了一些大的东西。感谢您的帮助以及对长篇解释的耐心!


为了清楚起见编辑:

当我说 URL 是从数据库构建时,我的意思是目录结构是根据数据库中的部门和类别构建的。

一些示例 URL -

Mystore/Refrigeration/Bar+Fridge.aspx
我的商店/烹饪+设备.aspx
我的商店/厨房/切割+Boards.asxpx

当我使用“饮料和酒吧”或“糕点/装饰”等部门来构建我的 URL 时,问题就出现了。尽管首先被编码,但这些都会导致上述问题。

除了特殊字符编码问题之外,我的处理程序已经实现并且工作正常。


您应该考虑在类别/部门表中创建一个表,其中每个类别都有唯一的 URL。然后您可以使用特殊例程来生成 URL。这可以是 SQL 标量函数,也可以是 CLR 函数,但它要做的事情之一就是标准化 Web 的 URL。您可以将“饮料和酒吧”转换为“饮料和酒吧”,将“糕点/装饰”转换为“糕点装饰”。主要是,该例程需要将所有无效的 HTTP URL 字符替换为其他字符。一个例子是这样的:

public static class URL
{
    static readonly Regex feet = new Regex(@"([0-9]\s?)'([^'])", RegexOptions.Compiled);
    static readonly Regex inch1 = new Regex(@"([0-9]\s?)''", RegexOptions.Compiled);
    static readonly Regex inch2 = new Regex(@"([0-9]\s?)""", RegexOptions.Compiled);
    static readonly Regex num = new Regex(@"#([0-9]+)", RegexOptions.Compiled);
    static readonly Regex dollar = new Regex(@"[$]([0-9]+)", RegexOptions.Compiled);
    static readonly Regex percent = new Regex(@"([0-9]+)%", RegexOptions.Compiled);
    static readonly Regex sep = new Regex(@"[\s_/\\+:.]", RegexOptions.Compiled);
    static readonly Regex empty = new Regex(@"[^-A-Za-z0-9]", RegexOptions.Compiled);
    static readonly Regex extra = new Regex(@"[-]+", RegexOptions.Compiled);

    public static string PrepareURL(string str)
    {
        str = str.Trim().ToLower();
        str = str.Replace("&", "and");

        str = feet.Replace(str, "$1-ft-");
        str = inch1.Replace(str, "$1-in-");
        str = inch2.Replace(str, "$1-in-");
        str = num.Replace(str, "num-$1");

        str = dollar.Replace(str, "$1-dollar-");
        str = percent.Replace(str, "$1-percent-");

        str = sep.Replace(str, "-");

        str = empty.Replace(str, string.Empty);
        str = extra.Replace(str, "-");

        str = str.Trim('-');
        return str;
    }
}

您可以将此作为 SQL 增强功能,或将 URL 生成作为单独的进程运行。然后,要实现映射,您可以将整个 URL 直接映射到类别 ID。从长远来看,这种方法更好,原因有几个。首先,您并不总是生成网址,只需执行一次,它们就保持静态,您不必担心您的程序发生变化,然后 GoogleBot 无法找到旧网址。此外,如果发生冲突,您可能会注意到潜在的重复类别名称,因为冲突只会因特殊字符而有所不同。最后,您始终可以从数据库中查看 URL,而无需运行映射函数。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ASP.Net URL 编码 的相关文章

  • HttpResponseMessage 的内容为 JSON

    我有一个 ASP NET MVC WEB API 由于多种原因 由于没有授权而重定向 我不能只使用一个简单的对象并在我的控制器方法中返回它 因此我需要 HttpResponseMessage 类来允许我重定向 目前我正在这样做 var re
  • 使用 QTextCursor 选择一段文本

    使用 Qt 框架选择文本片段时遇到问题 例如 如果我有这个文件 没有时间休息 我想选择 ime for r 并从文档中删除这段文本 我应该如何使用 QTextCursor 来做到这一点 这是我的代码 QTextCursor cursor n
  • ZedGraph 缩放和调整大小

    当我绘制图形 放大和缩小并重新绘制图形时 图形的位置不会改变 我想要做的是 每当重新绘制数据时 视图都会更改以查看所有图形数据 如果您在重绘之前放大或缩小 这似乎会被禁用 Thanks 设置属性 IsZoomOnMouseCenter对于控
  • 对相当大的整数的大集合的操作的快速实现

    描述 我实现了以下类 LabSetInt64 参见下面的代码 这里的目标是尽可能快地操作大量大整数 最多 10M 的值 我的主要要求集中在 至关重要 尽快获取集合的大小 基数 重要 能够非常快速地迭代一组集合 所以 从下面的实现开始 我还有
  • 函数原型和数组参数

    我正在学习 C 语法 并且已经开始研究数组了 我想问你一个问题 但首先让我回顾一下 这样我就知道我已经弄清楚了 我知道您可以使用以下语法将变量定义为数组 name
  • 如何获取任意类型的默认值

    在 C 中我可以写这样的东西 class AnyThing
  • CMake - 未定义参考

    我正在尝试将 gtest 包含到我的项目中 问题是我在 GTest 中收到未定义的引用错误 我正在尝试在 Gtest 中测试 Node 类 在节点的构造函数中 我使用类记录器 尽管我已将库记录器添加到 gtest target 中 但我仍然
  • F# 内联如何工作?

    对于 F 我的理解是您可以使用 inline 关键字在调用站点执行类型专门化 那是 val inline a gt b gt c when a or b static member a b gt c 约束条件是 a or b必须有一个静态成
  • 整数与双精度算术性能?

    我正在编写一个 C 类来使用整数执行 2D 可分离卷积 以获得比双对应更好的性能 问题是我没有获得真正的性能提升 这是 X 过滤器代码 对于 int 和 double 情况都有效 foreach pixel int value 0 for
  • 在标准库中静态链接时如何支持动态插件?

    假设一个应用程序myapp exe是使用构建的g 它使用标志 static libstdc 这样就可以安装在没有环境的情况下libstdc so myapp exe还添加了对某些功能的插件支持plugf可以通过动态加载dlopen来自共享库
  • 如何忽略搜索条件中的空属性

    我有一个不好的要求要做 无论如何 我必须在我的应用程序中实现它 我有一个Track class public class Track public string Name get set public string City get set
  • 一些涉及类析构函数和删除运算符的内存管理问题?

    在阅读了一些教程后 我仍然不清楚 C 中内存管理的一些观点 1 当使用 new 运算符声明的类超出范围时 是否会调用其析构函数并释放内存 是否有必要调用删除运算符来释放类的内存并调用其析构函数 class Test void newTest
  • Global.asax 错误处理程序或自定义 IHttpModule 错误处理程序未捕获未处理的异常

    我有一个类 DPCal EventMove 的一种方法 我想限制使用角色的访问 我有一个 Global asax cs 错误处理程序和一个自定义 IHttpModule 错误处理程序 旨在捕获未处理的异常 并将它们 Server Trans
  • 将函数作为函数参数传递

    Unity C 似乎无法识别Func lt gt 作为函数委托的符号 那么 如何将函数作为函数参数传递呢 我有一个想法Invoke functionName 0 可能有帮助 但我不确定它是否实际上立即调用该函数 或者等待帧结束 还有别的办法
  • 图片 URL 正确,但图片未显示

    我在 GoDaddy 上有一个网站 所有权限均已正确设置并且图像确实存在 但是 当页面加载时 所选项目的图像不会显示 这是我的代码 imagepath spaimages currentSpaModel Name ToString png
  • 在 C++ 中将大型数据向量写入/读取到二进制文件

    我有一个 C 程序 它通过将 ascii 文件中的网格人口数据读取到大型 8640x3432 元素双精度向量中来计算给定半径内的人口 将 ascii 数据读入向量大约需要 30 秒 循环每列和每行 而程序的其余部分只需要几秒钟 我被要求通过
  • 即使对于新上下文,OnModelCreating 也仅调用一次

    我有多个相同但内容不同的 SQL Server 表 在编写代码优先 EF6 程序时 我尝试为每个程序重用相同的数据库上下文 并将表名称传递给上下文构造函数 然而 虽然每次都会调用构造函数 但尽管每次都是从 new 创建数据库上下文 但 On
  • 通过 OCI 调用 Oracle 存储过程并使用 C++ 中的 out ref 游标返回结果

    我想使用 OCI 接口从 C 调用 Oracle 存储过程 并使用 out SYS REF CURSOR 作为过程的参数来迭代结果 我是 OCI 新手 所以可能会遗漏一些简单的东西 大部分代码取自这里 我的存储过程是 CREATE OR R
  • 为什么 32 位 .NET 进程的引用类型的最小大小为 12 字节

    我正在读专业 Net 性能 https rads stackoverflow com amzn click com 1430244585本书有关参考类型内部结构的部分 它提到 对于 32 位 net 进程 引用类型具有 4 字节的对象头和
  • “保留供任何使用”是什么意思?

    注意 这是一个c questions tagged c问题 虽然我补充说c questions tagged c 2b 2b如果某些 C 专家可以提供 C 使用与 C 不同的措辞的基本原理或历史原因 在 C 标准库规范中 我们有这个规范文本

随机推荐

  • iPhone X 状态栏黑色网络应用程序

    我正在开发一个网络应用程序 并使用模拟器在 iPhone X 上进行测试 状态栏完全是黑色的 如何让我的网站覆盖整个屏幕 我没有使用任何图书馆 我看到很多问题都提到了 Cordova 但我所拥有的只是带有 CSS 的 HTML 这是我的 H
  • 如何在 python ssl.wrap_socket() 中设置/查找 ca_certs 参数

    我正在尝试编写一个 python 2 7 脚本 通过 SSL 或 TLS 套接字连接到服务器 服务器存在并且可以提供其证书等 我找到了以下代码 s socket socket socket AF INET socket SOCK STREA
  • 当 Outlook Web 加载项通过 makeEwsRequestAsync api 发出 GetItem 请求时,接收“ErrorAccessDenied”响应代码

    我们正在使用 Exchange Server 和 Outlook 客户端版本的不同组合来测试 Outlook Web 加载项 该插件使GetItem请求通过makeEwsRequestAsync https dev office com r
  • 使用 Google Maps Javascript API 在我自己的图像上进行捏合缩放

    我正在尝试创建一个适合移动设备的网页 允许用户拖动 img 周围在一个 div 我已经使用了这个工作image ontouchstart方法 现在我想要做到这一点 以便用户在从 iOS 设备查看此内容时可以进行捏合缩放 我当前正在从 iPa
  • 如何配置oauth回调的路由

    我正在使用宝石OAuth2 https github com intridea oauth2与 Google 服务进行通信 我不明白如何实现回调 该回调接收带有 OAuth 代码的响应以获取访问令牌 当我在中设置断点时callback方法
  • 我们可以在 Firestore 中查询多深? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我只是在寻找在 Firestore 上设计数据库的答案 我有根集合的 4 级和 5 级子集合 在这个级
  • Azure 发布管道错误:无法获取 Kudu 应用程序设置。错误:服务暂时不可用(代码:503)

    我有一个 Azure DevOps 发布管道 它将容器部署到 Azure 中的应用程序服务 当我运行它时 部署容器的任务失败并显示消息 2020 10 23T16 12 20 8516547Z 错误 错误 无法获取 Kudu 应用程序设置
  • 使用 Hudson 发布 NUnit 测试结果报告时出现问题

    我在 Hudson 和 NUnit 测试方面遇到问题 当尝试发布 NUnit 的测试结果报告时 Hudson 中的选项 即 发布 NUnit 测试结果报告 会产生问题 我无法提供作业工作区文件夹下已创建的 XML 文件的路径 当我设置文件的
  • 如何配置 persistence.xml 提供者标签

    嘿 我正在学习这些东西 我并没有真正理解所有内容 而且我有一个问题 我不知道在 persistence xml 的提供者标签中写什么 这是我的 persistence xml 和 pom xml 文件 pom xml
  • 如何在运行时将图像加载到WPF?

    在运行时将图像加载到 WPF 窗口似乎相当复杂 Image image image new Uri Bilder sas png UriKind Relative Source new BitmapImage image 我正在尝试这段代码
  • 带百分比标签的 Ggplot 堆积条形图

    I am trying to do a stacked bar plot based on count but with the labels showing the percentage on the plot I have produc
  • 如何在 C++ 中加载共享对象?

    我有一个共享对象 so Windows dll 的 Linux 等效项 我想将其导入并与我的测试代码一起使用 我确信这不是那么简单 但这就是我想做的事情 include headerforClassFromBlah h int main l
  • 如何在 QuickGraph Dijkstra 或 A* 中设置目标顶点

    我使用的是 QuickGraph 3 6 版 我找到了函数 SetRootVertex 但没有 SetTagretVertex 我需要这个 因为我正在巨大的图中搜索短路径 这会大大加快程序速度 有问题的类是 DijkstraShortest
  • C++ 错误:基函数受保护

    我想知道为什么下面的代码不能编译 class base protected typedef void base function type const void function impl const error void base fun
  • 优化字符串连接的聚合[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 Update 对于那些有幽默感的人 您可以假设无论传递给它什么函数 聚合仍然会产生正常结果 包括在被优化的情况下 我编写这个程序是为了构建一
  • DataContract,默认 DataMember 值

    有没有办法在反序列化期间选择不在 xml 文件中的属性的默认值 If the mAgexml 文件中不存在属性 我想使用默认值 18 这可能吗 DataContract public class Person public Person D
  • 如何将触摸事件从 UIView 传递到其下方的 UIView?

    一个简单的问题 但我找不到解决方案 我有 2 个 UIView 一个在同一个父视图中 一个在另一个之上 都有GestureRecognizers在它们上 但只有最顶层正在接收事件 我怎样才能让最上面的视图将他获得的所有手势传递给它下面的其他
  • Golang MySQL 错误 - packet.go:33: 意外的 EOF

    我将整个代码库从 PHP 切换到 Go 在运行的几个进程中 我随机收到此错误 mysql 2016 10 11 09 17 16 packets go 33 unexpected EOF 这是我的 db 包 它处理与数据库的所有连接 pac
  • 有人可以向我解释一些 helm 的用例吗?

    我目前正在使用 kubernetes 并且遇到了 helm 假设我不喜欢用与我的应用程序无关的进程 感染 我的 kubernetes 集群 但如果它有益的话 我很乐意接受 所以我做了一些研究 但我仍然找不到任何使用我的 yaml 描述符和
  • ASP.Net URL 编码

    我正在 ASP net 中实现 URL 重写 但我的 URL 给我带来了很多问题 URL 是根据部门和类别的数据库生成的 我希望员工能够使用任何合适的特殊字符将项目添加到数据库中 而不会破坏网站 我在构建 URL 之前对数据进行编码 有几个