我的Web应用程序将URL段存储在数据库中.这些网址细分基于用户提交的内容.
我应该对URL中出现的字符串使用哪种排序规则?
我的假设是ASCII General CI(?)基于这个问题:哪些字符使URL无效?
System.out.println(
new URI("http", "example.com", "/servlet", "a=x%20y", null));
Run Code Online (Sandbox Code Playgroud)
结果是http://example.com/servlet?a=x%2520y,查询参数值与提供的值不同.奇怪,但这确实遵循Javadoc:
"百分比字符('%')总是由这些构造函数引用."
我们可以传递解码后的字符串,a=x y然后得到一个合理的(?)结果a=x%20y.
但是如果查询参数值包含"&"字符呢?例如,如果值是具有查询参数的URL本身,则会发生这种情况.看看这个(错误的)查询字符串:
a=b&c.必须在此处转义&符号(a=b%26c),否则这可以被视为查询参数a=b和一些垃圾(c).如果我将它传递给URI构造函数,它会对其进行编码,并返回错误的URL:...?a=b%2526c
这个问题似乎使java.util.URI无用.我在这里错过了什么吗?
java.net.URI确实知道URI的查询部分的存在,但它不了解查询部分的内部,这可能因每个方案而不同.例如,java.net.URI不了解HTTP查询部分的内部结构.如果java.net.URI将查询视为不透明字符串,并且未对其进行更改,则这不会成为问题.但它试图应用一些通用的百分比编码算法,它打破了HTTP URL.
因此,我不能使用URI类从其部分可靠地组装URL,尽管它有构造函数.我还要提到的是,从Java 7开始,相对化操作的实现非常有限,只有当一个URL是另一个URL的前缀时才有效.这两个功能(以及用于这些目的的更精简的界面)是我对java.net.URI感兴趣的原因,但它们都不适合我.
最后,我使用java.net.URL进行解析,并编写代码来汇编部件中的URL并重新激活两个URL.我还检查了Apache HttpClient URIBuilder类,虽然它确实理解了HTTP查询字符串的内部结构,但是从4.3开始,它在处理整个查询部分时遇到了像java.net.URI这样的编码问题.
(http([s]?):\/\/?)(([a-zA-Z0-9]+(\.?))+)([a-zA-Z0-9]+((\.[a-zA-Z]{2,5}){1,2})((\/[a-zA-Z0-9\?&=_\-\~:/?#[\]@!\$&'()\*\+,;]*)*)((\.[a-zA-Z]{2,5}){0,2}))
Run Code Online (Sandbox Code Playgroud)
这是我的正则表达式,它适用于匹配字符串中的链接.但我不希望它选择每个链接.如果链接">在它之前或</a>之后,则不应该对该链接进行数学运算.怎么做到呢?
这些应该匹配:
adasdas http://www.stackoverflow.com asdasas
adasdasahttp://www.stackoverflow.com/something asdas
Run Code Online (Sandbox Code Playgroud)
这些不应该匹配:
adasdas<a href="somelink"> http://www.stackoverflow.com </a>asdasas
adasdasa<a href="somelink">http://www.stackoverflow.com/something</a> asdas
Run Code Online (Sandbox Code Playgroud)
为什么我需要这个?:我希望每个链接都是可点击的,即使它不在锚标签之间.
我正在尝试将我购买的域名重定向到http://.ws到GoDaddy的另一个页面,但我访问该网站时获得的是:
"Bad Request - Invalid Hostname / HTTP Error 400. The request hostname is invalid."
Run Code Online (Sandbox Code Playgroud)
我已将GoDaddy的另一个域重定向到我正在尝试的同一页面,并且它正常工作.
新网址有问题吗?
编辑:看起来这是GoDaddy的一个问题,我只需要等待几天.也许现在工作得更快.
有一个WOPI客户端和主机,专门为其中一个Web应用程序设置,当文件名正确且没有任何URL保留字符时,在线编辑器工作顺利,但当文件名包含+,#,&签署WOPI协议时路由将这些字符视为分隔符并提供 404 错误,因为该路由对 GetFile、GetFileInfo 端点不可用。
例子:
[Route("files/{fileName}/")]
[HttpGet]
public async Task<FileInfoBE> GetFileInfo(string fileName, string access_token)
{ //Logic here }
Run Code Online (Sandbox Code Playgroud)
在上面的端点调用中,如果文件名包含加号 (+) 并且对该端点的调用是 URL 编码的,那么加号将被转换为 %2b,理想情况下它应该命中端点,但在调用之前webclient %2b 正在转换为 + 符号并给出 404 错误。
注意:自定义编码没有帮助,因为 OWA 服务器与 WOPI 服务交互。
我需要逃避"?" 网址中的字符,以便与搜索/ why-is-it?-1.html等重写网址一起使用
我目前在.htaccess中有以下内容
RewriteEngine on
RewriteRule ^search/(.*)-([0-9]+).html$ index.php?search=$1&page=$2 [L]
Run Code Online (Sandbox Code Playgroud)
谢谢
我有一个用C#编写的.NET 3.5 Web应用程序做一些包含文件路径的URL重写,我遇到了问题.当我调用string.Split('/')它时,它匹配'/'和'\'字符.那......应该发生吗?我假设它会注意到ASCII值不同并跳过它,但看起来我错了.
// url = 'someserver.com/user/token/files\subdir\file.jpg
string[] buffer = url.Split('/');
Run Code Online (Sandbox Code Playgroud)
上面的代码给出了一个string[]包含6个元素......这看起来很反直.有没有办法强制Split()只匹配正斜杠?现在我很幸运,因为违规的斜杠位于URL的末尾,我可以将其余的元素连接起来string[],但这对我们正在做的事情来说是很多工作,而不是一个很好的解决方案.潜在的问题.
有没有人遇到过这个?有一个简单的答案?我很感激!
更多代码:
url = HttpContext.Current.Request.Path.Replace("http://", "");
string[] buffer = url.Split('/');
Run Code Online (Sandbox Code Playgroud)
事实证明,Request.Path和Request.RawUrl都在改变我的斜线,这很荒谬.所以,是时候研究一下了,并弄清楚如何从不破坏格式的函数中获取URL.谢谢大家一起玩疯狂,抱歉这是一个误导性的问题!
C#与encodeURIComponent相当,在SO和其他地方都有很好的覆盖,但是呢?encodeURI呢?基本上,我想编码无效的URL字符,而不是保留的字符,如/,:等于是
"http://www.example.com/my cool page"
Run Code Online (Sandbox Code Playgroud)
将被编码为
"http://www.example.com/my%20cool%20page"
Run Code Online (Sandbox Code Playgroud)
有没有东西进入.NET这样做?或者是正则表达式我最好的选择?
目前,我的软件有以下工作流程
为了实现步骤 2,用户必须以字符串形式发送用于搜索的 URL 参数(例如age=10&gender=M)。
然后服务器将http_get(url + "?" + params_str_submitted_by_user)
恶意用户是否可以通过操纵使服务器连接到非预期的服务器params_str_submitted_by_user?
如果甚至保留换行符并且用户可以任意操纵 HTTP 标头,最坏的情况是什么?
如果有非法字符会发生什么?URL 是否通过将非法字符编码为其他内容来自行修复?