我有一个奇怪的问题,我希望有人能有所经验并能帮助我。
我在计算机上安装了一个tomcat,可以在需要时在本地运行它,但是随后我会将其发布到开发箱中进行测试。但是,URL编码的行为有所不同。
例如,HTTP动词如下所示(在邮递员中,删除了URL的其余部分)
e.originalEvent.dataTransfer
在我的本地计算机上,我在localhost_access_log中看到了这一点:
DELETE .../AAASnsAATAALI%2F5AAK/20181114110451
(我期望400。我已经了解了org.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH = true,我需要通过StackOverflow进行设置,这一切都可以正常进行)
但是,我在开发机器上的localhost_access_log中看到了这一点:
"DELETE ../AAASnsAATAALI%2F5AAK/20181114110451 HTTP/1.1" 400
我当然会收到404,因为某些东西将该%2F转换为/导致我的URL路径错误。
我对我的机器和开发机器之间的区别感到困惑。我不认为这可能是tomcat,因为我很确定自己可以直接安装(我比较了catalina.properties,它们是相同的)。这可能是IIS中导致开发箱出现问题的原因吗?我已经在这个头上摸了一段时间,所以我希望外面有人发生过这种事情。
任何指导表示赞赏。
编辑:
我最近发现,如果我直接引用tomcat进行服务调用,而不是使用Intranet URL,则会收到预期的400错误。因此,我觉得必须更改Intranet站点的设置。我现在正在经历它,但是没有经验。
答案 0 :(得分:0)
因此,如果有人遇到这个问题,我已经可以通过反复试验找出解决方案。
对于初学者来说,这是一个与IIS相关的问题。我没有足够的经验来回答特定的问题,但是如果出现任何问题,我会尽力而为。
我认为这可能是.NET 4.5(也许是4.0)的问题,在此响应时,我们处于4.7。因此,我听说他们在4.5中对URL的要求更为严格。默认情况下,IIS会解码您的编码URL。
需要做的第一件事是在IIS管理器中安装URL重写模块(或有足够的资金来了解编辑站点的web.config的语法)。我们没有这个,但是我找到了可以戴上它的人。需要向该模块添加新规则。我已经包含了适用于我的规则的web.config结果:
<rewrite>
<rules>
<rule name="Keep Original Encoded URL String" stopProcessing="true">
<match url="(.*)" />
<conditions>
<add input="{UNENCODED_URL}" pattern="(.*)" />
</conditions>
<action type="Rewrite" url="{C:0}" />
</rule>
</rules>
</rewrite>
基本上,这就是说获取URL并返回未编码的URL。
获得所有这些并不是结束的地方。输入该规则后进行尝试后,我收到此错误:
A potentially dangerous Request.Path value was detected from the client (%) rewrite.
在4.0中,URL的默认无效字符。
< > * % & : \ ?
因此,为了允许包含%,您必须通过设置requestPathInvalidCharacters并删除%来覆盖此默认值,这就是我现在要拥有的。
<system.web>
<httpRuntime requestPathInvalidCharacters="<,>,*,&,:,\,?" />
</system.web>
这样一来,我就能获得我期望的400错误请求。为了解决这个问题,请将其放在catalina.properties文件中。
org.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true
此解决方案对我有用。如果有人发现与他们有关的问题,请告诉我,以便我解决。希望这种解决方案可以对可能遇到问题的任何其他人起作用。