web-dev-qa-db-ja.com

画像はIISを使用して画像フォルダで直接機能しますが、そのディレクトリのサブフォルダに404を指定します

こんにちは、画像フォルダーとそのすべてのサブフォルダーから画像を配信できるようにするために、IIS(8.0)を構成するのに助けが必要です。

Web.configはルートにあります。その後、ほとんどのファイルをdistフォルダーから提供します。画像は./dist/img/*にあります。いくつかの画像フォルダがあります。

これが私たちの構成であり、主に興味深いのはハンドラーセクションです。

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <tracing>
            <traceFailedRequests>
                <remove path="*" />
                <add path="*">
                    <traceAreas>
                        <add provider="ASP" verbosity="Verbose" />
                        <add provider="ASPNET" areas="Infrastructure,Module,Page,AppServices" verbosity="Verbose" />
                        <add provider="ISAPI Extension" verbosity="Verbose" />
                        <add provider="WWW Server" areas="Authentication,Security,Filter,StaticFile,CGI,Compression,Cache,RequestNotifications,Module,FastCGI" verbosity="Verbose" />
                    </traceAreas>
                    <failureDefinitions statusCodes="200-999" />
                </add>
            </traceFailedRequests>
        </tracing>
        <rewrite>
            <rules>
                <!-- Redirect root url to index -->
                <rule name="Default route" stopProcessing="true">
                    <match url="^$" />
                    <action type="Rewrite" url="/dist/index.html" />
                </rule>
                <!-- Remove dist folder in URL -->
                <rule name="Add dist folder" stopProcessing="true">
                    <match url=".*" />
                    <conditions>
                        <add input="{PATH_INFO}" pattern="^/dist/" negate="true" />
                    </conditions>
                    <action type="Rewrite" url="/dist/{R:0}" />
                </rule>
            </rules>
            <outboundRules>
                <rule name="Remove ETag">
                    <match serverVariable="RESPONSE_ETag" pattern=".+" />
                    <action type="Rewrite" value="" />
                </rule>
            </outboundRules>
        </rewrite>
        <handlers>
            <clear />
            <!-- Serve files in dist folder as static content -->
            <add name="ImgStaticContent"
                 path="/dist/img/*"
                 verb="*"
                 allowPathInfo="true"
                 type="System.Web.StaticFileHandler"
            />
            <add name="ModelsStaticContent"
                 path="/dist/models/*"
                 verb="*"
                 allowPathInfo="true"
                 type="System.Web.StaticFileHandler"
            />
            <add name="DistStaticContent"
                 path="/dist/*"
                 verb="*"
                 allowPathInfo="true"
                 type="System.Web.StaticFileHandler"
            />
        </handlers>

        <!-- Cache static content  -->
        <staticContent>
            <!-- Remove ETAG IN IIS >= 8 ; for IIS 7/7.5 see the Rewrite rules (bigger description of why you might remove etag down there aswell)
            <clientCache setEtag="false"/>
            -->
            <!-- Set expire headers to 30 days for static content-->
            <clientCache cacheControlMaxAge="30.00:00:00" cacheControlMode="UseMaxAge"/>
            <!-- use utf-8 encoding for anything served text/plain or text/html -->
            <!-- in the case of .html files; if you AJAX load html files (i.e. in angular) then remove these two lines. -->
            <remove fileExtension=".html"/>
            <mimeMap fileExtension=".html" mimeType="text/html; charset=UTF-8"/>
            <remove fileExtension=".css"/>
            <mimeMap fileExtension=".css" mimeType="text/css"/>
            <remove fileExtension=".js"/>
            <mimeMap fileExtension=".js" mimeType="text/javascript"/>
            <remove fileExtension=".json"/>
            <mimeMap fileExtension=".json" mimeType="application/json"/>
            <remove fileExtension=".rss"/>
            <mimeMap fileExtension=".rss" mimeType="application/rss+xml; charset=UTF-8"/>
            <remove fileExtension=".xml"/>
            <mimeMap fileExtension=".xml" mimeType="application/xml; charset=UTF-8"/>
            <!-- HTML5 Audio/Video mime types-->
            <remove fileExtension=".mp3"/>
            <mimeMap fileExtension=".mp3" mimeType="audio/mpeg"/>
            <remove fileExtension=".mp4"/>
            <mimeMap fileExtension=".mp4" mimeType="video/mp4"/>
            <remove fileExtension=".ogg"/>
            <mimeMap fileExtension=".ogg" mimeType="audio/ogg"/>
            <remove fileExtension=".ogv"/>
            <mimeMap fileExtension=".ogv" mimeType="video/ogg"/>
            <remove fileExtension=".webm"/>
            <mimeMap fileExtension=".webm" mimeType="video/webm"/>
            <!-- Proper svg serving. Required for svg webfonts on iPad -->
            <remove fileExtension=".svg"/>
            <mimeMap fileExtension=".svg" mimeType="image/svg+xml"/>
            <remove fileExtension=".svgz"/>
            <mimeMap fileExtension=".svgz" mimeType="image/svg+xml"/>
            <!-- HTML4 Web font mime types -->
            <!-- Remove default IIS mime type for .eot which is application/octet-stream -->
            <remove fileExtension=".eot"/>
            <mimeMap fileExtension=".eot" mimeType="application/vnd.ms-fontobject"/>
            <remove fileExtension=".ttf"/>
            <mimeMap fileExtension=".ttf" mimeType="application/x-font-ttf"/>
            <remove fileExtension=".ttc"/>
            <mimeMap fileExtension=".ttc" mimeType="application/x-font-ttf"/>
            <remove fileExtension=".otf"/>
            <mimeMap fileExtension=".otf" mimeType="font/opentype"/>
            <remove fileExtension=".woff"/>
            <mimeMap fileExtension=".woff" mimeType="application/font-woff"/>
            <remove fileExtension=".woff2"/>
            <mimeMap fileExtension=".woff2" mimeType="font/woff2"/>
            <remove fileExtension=".crx"/>
            <mimeMap fileExtension=".crx" mimeType="application/x-chrome-extension"/>
            <remove fileExtension=".xpi"/>
            <mimeMap fileExtension=".xpi" mimeType="application/x-xpinstall"/>
            <remove fileExtension=".safariextz"/>
            <mimeMap fileExtension=".safariextz" mimeType="application/octet-stream"/>
            <!-- Flash Video mime types-->
            <remove fileExtension=".flv"/>
            <mimeMap fileExtension=".flv" mimeType="video/x-flv"/>
            <remove fileExtension=".f4v"/>
            <mimeMap fileExtension=".f4v" mimeType="video/mp4"/>
            <!-- Assorted types -->
            <remove fileExtension=".ico"/>
            <mimeMap fileExtension=".ico" mimeType="image/x-icon"/>
            <remove fileExtension=".webp"/>
            <mimeMap fileExtension=".webp" mimeType="image/webp"/>
            <remove fileExtension=".htc"/>
            <mimeMap fileExtension=".htc" mimeType="text/x-component"/>
            <remove fileExtension=".vcf"/>
            <mimeMap fileExtension=".vcf" mimeType="text/x-vcard"/>
            <remove fileExtension=".torrent"/>
            <mimeMap fileExtension=".torrent" mimeType="application/x-bittorrent"/>
            <remove fileExtension=".cur"/>
            <mimeMap fileExtension=".cur" mimeType="image/x-icon"/>
            <remove fileExtension=".webapp"/>
            <mimeMap fileExtension=".webapp" mimeType="application/x-web-app-manifest+json; charset=UTF-8"/>
        </staticContent>
        <urlCompression doStaticCompression="true" doDynamicCompression="true" />
        <httpCompression minFileSizeForComp="0">
            <dynamicTypes>
                <clear />
                <add enabled="true" mimeType="text/*"/>
                <add enabled="true" mimeType="message/*"/>
                <add enabled="true" mimeType="application/x-javascript"/>
                <add enabled="true" mimeType="application/javascript"/>
                <add enabled="true" mimeType="application/json"/>
                <add enabled="false" mimeType="*/*"/>
                <add enabled="true" mimeType="application/atom+xml"/>
                <add enabled="true" mimeType="application/atom+xml;charset=utf-8"/>
            </dynamicTypes>
            <staticTypes>
                <clear />
                <add enabled="true" mimeType="text/*"/>
                <add enabled="true" mimeType="message/*"/>
                <add enabled="true" mimeType="application/javascript"/>
                <add enabled="true" mimeType="application/atom+xml"/>
                <add enabled="true" mimeType="application/xaml+xml"/>
                <add enabled="true" mimeType="application/json"/>
                <add enabled="false" mimeType="*/*"/>
            </staticTypes>
        </httpCompression>
        <directoryBrowse enabled="false"/>
        <validation validateIntegratedModeConfiguration="false"/>
    </system.webServer>
</configuration>

問題は、ファイルが正しく配信されないことです。画像フォルダの直下の画像以外の画像を要求すると、404が表示されます。

UPDATE

IISのエラーレポートは次のようになります。 (404)正しいハンドラーが使用され、エラーレポートで指定された物理パスにあることが検証されました。

Detailed Error Information:
Module     ManagedPipelineHandler
Notification       ExecuteRequestHandler
Handler    ImgStaticContent
Error Code     0x00000000
Requested URL      Host:80/dist/img/signs/traffic_signs/forbuds_marken/c31-11.png
Physical Path      D:\home\site\wwwroot\dist\img\signs\traffic_signs\forbuds_marken\c31-11.png
Logon Method       Anonymous
Logon User     Anonymous

更新

以下のような特定のサブフォルダーのハンドラーを追加した場合。これらの画像は正しく配信されます。ただし、サブフォルダーの数を考えると、すべてのフォルダーに対してこれを行うことはできません。

        <add name="test"
             path="/dist/img/signs/traffic_signs/forbuds_marken/*"
             verb="*"
             allowPathInfo="true"
             type="System.Web.StaticFileHandler" />

メインディレクトリだけでなくサブディレクトリでも機能するようにハンドラを構成するにはどうすればよいですか。

1
Pablo Jomer

確認することをお勧めするアイテム:

  • 画像フォルダとファイルの両方の権限(ユーザーとグループ)を確認してください。
  • Webディレクトリツリーの所有権を確認します。
  • 構成はルートにあると述べましたが、Web所有者がその構成に適切にアクセスできることを確認してください。

これらの権限を確認し、必要に応じて修正したら、エラー監視ツールを使用してエラーが引き続き発生する場合は、例外/エラーをより迅速に見つけ、おそらく問題の正確な場所を特定できます。 Sentry、 Bugsnag 、Airbrakeを含むそれらの多くがあります。

1
Lena Weber