0

我有一个运行 Windows 2016 (IIS 10) 的全新虚拟服务器。我有一个使用 .NET Core 1.1 构建的网站。

我想重写所有图像、js、字体和 css 引用以指向 CDN。

问题1,添加这条规则:

<rule name="CDN Assets" stopProcessing="true">
    <match url="^css/(.+)$|^images/(.+)$|^fonts/(.+)$|^js/(.+)$" ignoreCase="true" />
    <action type="Rewrite" url="https://cdn.example.net/{R:0}" appendQueryString="true" />
</rule>

...对于每个请求都会导致 404。例如对https://example.net/images/en-us/logo.png的请求,即使图像存在于 https://cdn.example.net/images/en-us 下的真实文件夹中和https://cdn.example.net/images/en-us /logo.png

这可能是由 .NET Core 还是 HTTP2(在 IIS 10 中引入)引起的。还是我还需要某种出站规则?

问题 2,添加出站规则,例如:

<rule name="Outbound CDN: images" preCondition="IsHtml">
    <match filterByTags="A, Img, Link" pattern="^/images/(.+)$" />
    <action type="Rewrite" value="//cdn.example.net{R:0}" />
</rule>
<preConditions>
    <preCondition name="IsHtml">
        <add input="{RESPONSE_CONTENT_TYPE}" pattern="^text/html"/>
    </preCondition>
</preConditions>

导致页面响应变成完全损坏的不可读垃圾。这是因为响应是通过 HTTPS 发送的吗?


更新(2016 年 3 月 16 日晚上 8:01 MST)

使用@EricB 建议,我尝试通过 Microsoft.ASPNetCore.Rewrite 包实现它,但无济于事。

我的Startup.cs中有这个,并且只加载了本地图像:

string CDNroot = Configuration["URLs:CDN"].Trim();
RewriteOptions rewriteOptions = new RewriteOptions()
    .AddRewrite(@"^(css|images|fonts|js)(.+)$", CDNroot + "/$1$2", skipRemainingRules: true);
app.UseRewriter(rewriteOptions);

如果我将其更改为:

string CDNroot = Configuration["URLs:CDN"].Trim();
RewriteOptions rewriteOptions = new RewriteOptions()
    .AddRedirect(@"^(css|images|fonts|js)(.+)$", CDNroot + "/$1$2");
app.UseRewriter(rewriteOptions);

...并请求一个图像 URL,它被正确地重定向到 CDN URL。但是您不会想要重定向,因为这会为每个资产请求添加额外的 30 倍响应。我很困惑为什么 Redirect 有效,但 Rewrite 没有。

4

0 回答 0