IIS ARR替换查询字符串中编码斜杠%2F

wgx48brx  于 2022-11-12  发布在  其他
关注(0)|答案(1)|浏览(159)

我有一个gitlab ce安装在局域网内的VM Ubuntu-GLS上。为了给予它可以从互联网访问,我在我的主Web服务器上使用了IIS ARR URL重写模块。Gitlab通过API从仓库获取一些文件需要用正斜杠分割目录,编码为% 2F。如果我向gitlab API发送如下请求:
curl --header "PRIVATE-TOKEN: <myPrivToken>" "http://gitlab.mysite.com/api/v4/projects/8/repository/files/DemoAM%2F.project?ref=master"
其中DemoAM是根仓库中的文件夹。ARR替换了正斜杠上的% 2F,gitlab得到如下请求(我隐藏了gitlab日志中的一些不重要的字段):

{
  "status": 404,
  "method": "GET",
  "path": "/api/v4/projects/8/repository/files/DemoAM/.project",
  "host": "Ubuntu-GLS",
  "remote_ip": "192.168.0.1:58496, 192.168.0.102, 127.0.0.1"....

其中用/替换了%2F
但如果我直接发送请求到本地VM/ like:
curl --header "PRIVATE-TOKEN: <myPrivToken>" "http://Ubuntu-GLS/api/v4/projects/8/repository/files/DemoAM%2F.project?ref=master"
gitlab获得正确的请求,例如:

{
  "status": 200,
  "method": "GET",
  "path": "/api/v4/projects/8/repository/files/DemoAM%2F.project",
  "host": "Ubuntu-GLS",
  "remote_ip": "192.168.0.102, 127.0.0.1"....

其中,如果%2F按原样提供,并且正确
我在rewrite urls with slashes ( %2F ) in query string中找到了一个非常相似的问题,但是我不能使用它的答案,因为我不能修改gitlab请求规则。另外,我尝试将useOriginalURLEncoding设置为false,但没有结果,这是这里推荐的:是的。

那么,有没有其他方法可以解决这个问题?我希望得到的解决方案是,rest string {R:1}将按原样传递throw,而不替换编码符号

我使用的规则是这样的:

<rule name="ReverseProxyInboundRule1" enabled="true" stopProcessing="true">
        <match url="(.*)" />
        <conditions logicalGrouping="MatchAny">
            <add input="{CACHE_URL}" pattern="^(https?)://gitlab\.mysite\.com" />
        </conditions>
        <action type="Rewrite" url="{C:1}://Ubuntu-GLS/{R:1}" appendQueryString="true" />
        <serverVariables>
            <set name="HTTP_X_ORIGINAL_ACCEPT_ENCODING" value="{HTTP_ACCEPT_ENCODING}" />
            <set name="HTTP_ACCEPT_ENCODING" value="" />
        </serverVariables>
    </rule>
    <outboundRules>
        <rule name="ReverseProxyOutboundRule1" preCondition="ResponseIsHtml1" enabled="true">
           <match filterByTags="A, Form, Img" pattern="^http(s)?://Ubuntu-GLS/(.*)" />
            <action type="Rewrite" value="http{R:1}://gitlab.mysite.com/{R:2}" />
        </rule>
        <preConditions>
            <preCondition name="ResponseIsHtml1">
                <add input="{RESPONSE_CONTENT_TYPE}" pattern="^text/html" />
            </preCondition>
            <preCondition name="NeedsRestoringAcceptEncoding">
                <add input="{HTTP_X_ORIGINAL_ACCEPT_ENCODING}" pattern=".*" />
            </preCondition>
        </preConditions>
    </outboundRules>
dxxyhpgq

dxxyhpgq1#

变更

<action type="Rewrite" url="{C:1}://Ubuntu-GLS/{R:1}" appendQueryString="true" />

<action type="Rewrite" url="{C:1}://Ubuntu-GLS{UNENCODED_URL}" appendQueryString="false" />

并且还改变请求过滤以允许双重转义。

参考

https://blogs.iis.net/iisteam/url-rewrite-v2-1

相关问题