5

Azure Web アプリ内で正常に動作するようになった Laravel 4 ベースの PHP アプリケーションがあります。唯一の問題は、からファイルにアクセスしようとするとexample.azurewebsites.net/js/vendor/jquery.slicknav.min.js、「このディレクトリまたはページを表示する権限がありません。 " 応答。

このフォルダーsite/wwwrootは、すべての Laravel アプリケーション ファイルを配置する場所です。Laravel に慣れていない方のために説明すると、このフォルダーには app、Bootstrap、public、および vendor の 4 つのフォルダーが含まれています。

Azure portal で [仮想アプリケーションとディレクトリ] 設定を、次の内容の web.config ファイルにマップしパブリック ディレクトリ内に配置/するように設定しました。site\wwwroot\public

<?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-表示できますsortable.min.jsexample.azurewebsites.net/js/vendor-/sortable.min.js

4

3 に答える 3

10

パス内のすべてのフォルダーがvendor403 禁止を返す理由は、Azure コンポーザー Web アプリ拡張機能がインストールされていたためです。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>

<clear/>私にとっては、拡張機能を削除すると明らかに問題が解決しましたが、書き換えルールセクションにa を追加すると、拡張機能によって設定されたルールがクリアされ、問題が修正されると感じています。

今後の参考のために、この問題は2015 年 11 月 7 日と 2015 年7 月 23 日に延長に対して提起されました。

<clear/>以下は、問題を修正するために使用する修正された 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>
                <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>
于 2016-02-04T10:21:28.823 に答える