在 Azure Web 应用程序中使用重写规则获取权限错误

Posted

技术标签:

【中文标题】在 Azure Web 应用程序中使用重写规则获取权限错误【英文标题】:Getting permission error with rewrite rules within Azure web app 【发布时间】:2016-05-12 16:02:24 【问题描述】:

我有一个基于 Laravel 4 的 php 应用程序,我已成功在 Azure Web 应用程序中工作,我遇到的唯一问题是尝试从 example.azurewebsites.net/js/vendor/jquery.slicknav.min.js 访问文件时,我收到“您无权访问查看此目录或页面。”回应。

site/wwwroot 文件夹是我放置所有 Laravel 应用程序文件的地方,对于那些不熟悉 Laravel 的人来说,它包含四个文件夹:app、Bootstrap、public 和 vendor。

我在 Azure 门户中设置了虚拟应用程序和目录设置,将/ 映射到site\wwwroot\public,并在公共目录中放置了一个包含以下内容的 web.config 文件:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <system.webServer>
        <urlCompression doDynamicCompression="true" doStaticCompression="true" dynamicCompressionBeforeCache="true"/>
        <staticContent>
            <remove fileExtension=".svg" />
            <mimeMap fileExtension=".svg" mimeType="image/svg+xml" />
            <mimeMap fileExtension=".woff" mimeType="application/font-woff" />
            <clientCache httpExpires="Sun, 29 Mar 2020 00:00:00 GMT" cacheControlMode="UseExpires" />
        </staticContent>
        <httpProtocol>
            <customHeaders>
                <add name="Strict-Transport-Security" value="max-age=31536000; includeSubDomains"/>
                <add name="Access-Control-Allow-Origin" value="*" />
                <add name="Access-Control-Allow-Headers" value="X-Requested-With,Content-Type" />
                <add name="Access-Control-Allow-Methods" value="POST,GET,OPTIONS,DELETE,PUT,PATCH" />
            </customHeaders>
        </httpProtocol>
        <rewrite>
            <rules>
                <rule name="Laravel4" stopProcessing="true">
                    <match url="^" ignoreCase="false" />
                    <conditions logicalGrouping="MatchAll">
                        <add input="REQUEST_FILENAME" matchType="IsDirectory" negate="true" />
                        <add input="REQUEST_FILENAME" matchType="IsFile" negate="true" />
                    </conditions>
                    <action type="Rewrite" url="index.php" appendQueryString="true" />
                </rule>
            </rules>
        </rewrite>    
    </system.webServer>
</configuration>

通过此设置,重写按预期工作,除非文件夹名称包含 app、Bootstrap、public 或 vendor,因为它与 example.azurewebsites.net/js/vendor/jquery.slicknav.min.js 一样。

我的问题是如何修改我的重写规则来解决这个问题?如果我通过在末尾添加连字符来重命名文件夹site\wwwroot\public\js\vendor\,它将起作用。我也多次重启了容器。

编辑为了更清楚,这是我的目录结构:

├─ wwwroot
│  └─ app
│  └─ bootstrap
│  ├─ public
│  │  └─ css
│  │  └─ files
│  │  └─ fonts
│  │  └─ imgs
│  │  ├─ js
│  │  │  └─ admin
│  │  │  ├─ app
│  │  │  │  └─ link-check.js
│  │  │  └─ old
│  │  │  ├─ vendor
│  │  │  │  └─ sortable.min.js
│  │  └─ less
│  │  └─ packages
│  │  └─ tmp
│  │  └─ uploads
│  └─ vendor
└─ ...

使用我的web.config 配置,link-check.js 可以通过example.azurewebsites.net/js/app/link-check.js 访问,而 sortable.min.js不能 通过example.azurewebsites.net/js/vendor/sortable.min.js 访问(并且 /js/vendor 路径中没有其他内容是可访问)。

注意:如果我将wwwroot\public\js\vendor 重命名为wwwroot\public\js\vendor-,我可以从example.azurewebsites.net/js/vendor-/sortable.min.js 中查看sortable.min.js

【问题讨论】:

【参考方案1】:

您可以尝试以下步骤:

虚拟应用程序和目录部分的设置修改回映射/site\wwwroot\

public 文件夹中的web.config 移动到根目录,这可能是您服务器中的site\wwwroot

修改web.config内容为如下内容:

规则> 规则> 条件> 规则> 规则> 重写> 配置>

【讨论】:

我仍然收到 403 错误,并且使用该配置我会收到额外的 404 错误,我可以整理这些错误。它对存在的文件的 403 权限被拒绝。我认为这可能是因为在配置的虚拟目录之外存在一个名为 vendor 的文件夹,但 app 和 admin 也存在并且它们可以工作。我正在用我的目录结构修改我的问题。【参考方案2】:

事实证明,路径中所有带有 vendor 的文件夹返回 403 禁止的原因是我有 Azure composer web app extension installed。在该扩展的applicationHost.xdt 文件中,它设置了以下重写:

<rewrite xdt:Transform="InsertIfMissing">
  <rules xdt:Transform="InsertIfMissing">
    <rule name="RequestBlockingRule1" xdt:Locator="Match(name)" xdt:Transform="InsertIfMissing" stopProcessing="true">
                <match url=".*" />
                <conditions>
                    <add input="URL" pattern="vendor/(.*)$" />
                </conditions>
                <action type="CustomResponse" statusCode="403" statusReason="Forbidden: Access is denied." statusDescription="You do not have permission to     view this directory or page using the credentials that you supplied." />
            </rule>
  </rules>
</rewrite>

对我来说,删除扩展显然解决了问题,但是我觉得在我的重写规则部分添加 &lt;clear/&gt; 会清除扩展设置的规则并解决问题。

此问题针对7th Nov 2015 和23rd July 2015 上的扩展提出,以供将来参考。

下面显示了我修改后的 web.config,它使用&lt;clear/&gt; 来解决问题

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <system.webServer>
        <urlCompression doDynamicCompression="true" doStaticCompression="true" dynamicCompressionBeforeCache="true"/>
        <staticContent>
            <remove fileExtension=".svg" />
            <mimeMap fileExtension=".svg" mimeType="image/svg+xml" />
            <mimeMap fileExtension=".woff" mimeType="application/font-woff" />
            <clientCache httpExpires="Sun, 29 Mar 2020 00:00:00 GMT" cacheControlMode="UseExpires" />
        </staticContent>
        <httpProtocol>
            <customHeaders>
                <add name="Strict-Transport-Security" value="max-age=31536000; includeSubDomains"/>
                <add name="Access-Control-Allow-Origin" value="*" />
                <add name="Access-Control-Allow-Headers" value="X-Requested-With,Content-Type" />
                <add name="Access-Control-Allow-Methods" value="POST,GET,OPTIONS,DELETE,PUT,PATCH" />
            </customHeaders>
        </httpProtocol>
        <rewrite>
            <rules>
                <clear/>
                <rule name="Laravel4" stopProcessing="true">
                    <match url="^" ignoreCase="false" />
                    <conditions logicalGrouping="MatchAll">
                        <add input="REQUEST_FILENAME" matchType="IsDirectory" negate="true" />
                        <add input="REQUEST_FILENAME" matchType="IsFile" negate="true" />
                    </conditions>
                    <action type="Rewrite" url="index.php" appendQueryString="true" />
                </rule>
            </rules>
        </rewrite>    
    </system.webServer>
</configuration>

【讨论】:

【参考方案3】:

我在 webconfig 中添加了 clear 并为我工作。

<configuration>
  <system.webServer>
    <rewrite>
      <rules>
        <rule name="Imported Rule 1" stopProcessing="true">
          <match url="^(.*)/$" ignoreCase="false" />
          <conditions>
            <add input="REQUEST_FILENAME" matchType="IsDirectory" ignoreCase="false" negate="true" />
          </conditions>
          <action type="Redirect" redirectType="Permanent" url="/R:1" />
        </rule>
         <clear/>
        <rule name="Imported Rule 2" stopProcessing="true">
          <match url="^" ignoreCase="false" />
          <conditions>
            <add input="REQUEST_FILENAME" matchType="IsDirectory" ignoreCase="false" negate="true" />
            <add input="REQUEST_FILENAME" matchType="IsFile" ignoreCase="false" negate="true" />
          </conditions>
          <action type="Rewrite" url="index.php" />
        </rule>
      </rules>
    </rewrite>
  </system.webServer>
</configuration>

【讨论】:

以上是关于在 Azure Web 应用程序中使用重写规则获取权限错误的主要内容,如果未能解决你的问题,请参考以下文章

Azure Web App HTTP/HTTPS 重写规则

Azure CDN URL使用令牌身份验证和Blob存储SAS重写规则

重写规则弄乱web api 2 / token

使用Azure Web App上的web.config将子域重写到目录

IIS 重写规则

Azure 网站 - 使用 web.config 重写 URL 不起作用