IIS7和ARR作为Subversion的反向代理

时间:2009-09-27 12:57:43

标签: svn iis-7 reverse-proxy

我正在使用IIS7和Application Request Routing扩展来充当在Apache上运行的Subversion的反向代理。

代理工作正常,我能够探索服务器,甚至执行“签出”。但是,我无法浏览通常被ASP.NET禁止的文件 - 例如.cs,.csproj等。 ASP.NET不关心的文件 - 例如.txt - 很好。

我尝试编辑全局web.config以删除这些文件的Forbidden处理程序映射,但它似乎没有什么区别。有没有办法允许IIS7中的URL重写模块工作,同时允许呈现所有文件扩展名?

3 个答案:

答案 0 :(得分:16)

IIS7有一个applicationHost.config文件,其中包含一个限制文件扩展名的安全部分:

<requestFiltering>
  <fileExtensions allowUnlisted="true" applyToWebDAV="true">
    <add fileExtension=".cs" allowed="false" />
    <add fileExtension=".csproj" allowed="false" />
    <add fileExtension=".vb" allowed="false" />
    <add fileExtension=".vbproj" allowed="false" />
    ....
  </fileExtensions>

更多信息:

http://learn.iis.net/page.aspx/143/how-to-use-request-filtering/

我在网站的web.config中添加了一个类似的部分,并使用<clear />节点删除了所有扩展名。现在我可以提供.cs,.csproj文件和其他文件,但我无法提供.config文件。

编辑:删除hiddenSection节点也会对web.config文件进行更正。这是我的本地web.config文件:

<system.webServer>
  <security>
    <requestFiltering>
      <fileExtensions allowUnlisted="true" applyToWebDAV="true">
        <clear />
      </fileExtensions>
      <verbs allowUnlisted="true" applyToWebDAV="true" />
      <hiddenSegments applyToWebDAV="true">
        <clear />
      </hiddenSegments>
    </requestFiltering>
  </security>
</system.webServer>

答案 1 :(得分:4)

我使用web.config看起来像这样:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <rewrite>
            <rules>
                <rule name="ReverseProxyInboundRule1" stopProcessing="true">
                    <match url="(.*)" />
                    <conditions>
                        <add input="{CACHE_URL}" pattern="^(https?)://" />
                    </conditions>
                    <action type="Rewrite" url="{C:1}://localhost:8080/{R:1}" />
                </rule>
            </rules>
            <outboundRules>
                <rule name="ReverseProxyOutboundRule1" preCondition="ResponseIsHtml1">
                    <match filterByTags="A, Form, Img" pattern="^http(s)?://localhost:8080/(.*)" />
                    <action type="Rewrite" value="http{R:1}://svn.mysite.com/{R:2}" />
                </rule>
                <preConditions>
                    <preCondition name="ResponseIsHtml1">
                        <add input="{RESPONSE_CONTENT_TYPE}" pattern="^text/html" />
                        <add input="{RESPONSE_CONTENT_ENCODING}" pattern="[^(gzip)]" />
                    </preCondition>
                </preConditions>
            </outboundRules>
        </rewrite>
        <security>
        <requestFiltering>
          <fileExtensions allowUnlisted="true" applyToWebDAV="true">
            <clear />
          </fileExtensions>
          <verbs allowUnlisted="true" applyToWebDAV="true" />
          <hiddenSegments applyToWebDAV="true">
            <clear />
          </hiddenSegments>
        </requestFiltering>
      </security>
    </system.webServer>
</configuration>

答案 2 :(得分:1)

除了 Paul Stovell 的回答之外,我还建议激活双重转义。我在检索文件名中包含“+”字符的文件时遇到错误。双重转义消除了这个问题:

    <configuration>
        <system.webServer>
            <rewrite>
                <rules>
                    <rule name="SVNIn" stopProcessing="false">
                        <match url="(.*)" />
                        <action type="Rewrite" url="http://localhost:8082/svn/{R:1}" />
                    </rule>
                </rules>
            </rewrite>
            <security>
                <requestFiltering allowDoubleEscaping="true">
                    <fileExtensions allowUnlisted="true" applyToWebDAV="true">
                        <clear />
                    </fileExtensions>
                    <verbs allowUnlisted="true" applyToWebDAV="true" />
                    <hiddenSegments applyToWebDAV="true">
                        <clear />
                    </hiddenSegments>
                </requestFiltering>
            </security>
        </system.webServer>
    </configuration>