重写 HTTPS 规则后图像不显示

Images not displayed after rewrite rule for HTTPS

我正在开发托管在 Azure 云中的 MVC Web 应用程序。 一切正常,因为我制定了重写 URL 的规则以强制使用 HTTPS :

<rewrite>
  <rules>
    <clear />
    <rule name="Redirect to https" stopProcessing="true">
      <match url="(.*)" ignoreCase="false" />
      <conditions>
        <add input="{HTTPS}" pattern="off"  />
      </conditions>
      <action type="Redirect" url="https://{HTTP_HOST}/{R:1}" redirectType="Permanent" appendQueryString="true" />
    </rule>
  </rules>
</rewrite>

我所有的图像现在都没有在生产中显示。 这是我用来显示图像的剃刀:

<img src="@Url.Content("~/Content/Images/Picture.png")" />

我试图推迟重写规则,但它似乎是"permanent",即使相关代码在web.config.

中被注释

我已经尝试将此添加到我的 web.config :

<configuration>
 <location path="~/Content/Images">
  <system.web>
     <authorization>
        <allow users="*"/> ---or even "?"
     </authorization>
  </system.web>

但没有任何变化。

有什么想法吗?

谢谢。

-- 编辑 为了最完整,这里是我的 _layout 页面的头节点:

@*@Styles.Render("~/Content/css")
@Scripts.Render("~/bundles/modernizr")*@
@Styles.Render("~/Content/Site.css")
@Styles.Render("~/Content/Slick/slick.css")
@Styles.Render("~/Content/Slick/slick-theme.css")
@Scripts.Render("~/bundles/jquery")
@Scripts.Render("~/Scripts/Slick/slick.min.js")
@Scripts.Render("~/bundles/bootstrap") 
@RenderSection("scripts", required:=False)

也许我设置的顺序有误?这将是令人惊讶的,因为它以前有效。

顺便说一句,在调试模式下,我也没有更多 CSS/JS 了!

让我们开始: 我试图推迟重写规则但它似乎是"permanent",即使相关代码在web.config.

中被注释

永久重定向存储在浏览器中,是的,当您访问 x -> 从服务器重定向到 -> y 浏览器时,您希望它们存储在浏览器中,帮助您加快速度,为您提供准确的页面。清除您的导航历史,浏览器将再次访问原始资源。

从 http 到 https 的图像有问题,为了让它正常工作,您需要确保使用 http 提供正确的图像。

第一步:

<system.webServer>
  <rewrite>
    <rules>
      <rule name="Redirect to https">
        <match url="(.*)" />
        <conditions>
          <add input="{HTTPS}" pattern="off" ignoreCase="true" />
          <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
        </conditions>
        <action type="Redirect" url="https://{SERVER_NAME}/{R:1}" redirectType="Permanent" appendQueryString="true"  />
      </rule>
    </rules>
  </rewrite>

排除要重定向到 https 的文件,您可以检查是否确实可以在没有 https 的情况下访问这些文件。如果您再次收到 404,则您对 azure 文件的 http 访问存在问题( 需要在执行重定向之前可访问)。并确保在此规则之后您没有对文件进行其他重定向或重写。

如果这不是问题,请确保您在 url 中手动将图像从 http 更改为 https 是否正常(再次检查重写或重定向)

如果您可以访问图像,则表示您的浏览器或 fiddler 存在缓存问题。 如果不是,那么您的托管应用程序不正确,图像托管在同一实例的另一个应用程序下,wwroot 与您的应用程序文件夹如果您有类似的东西,请再次检查@Url.Content 做了什么,看看谁在为您服务.

好的!我终于找到了问题所在。我所做的是将此规则放入我的 web.config :

<rewrite>
 <rules>
  <rule name="Redirect to https">
    <match url="(.*)" />
    <conditions>
      <add input="{HTTPS}" pattern="off" ignoreCase="true" />
      <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
    </conditions>
    <action type="Redirect" url="https://{SERVER_NAME}/{R:1}" redirectType="Permanent" appendQueryString="true"  />
  </rule>
</rules>

我认为我的不正确。感谢@SilentTremor。

然后我从头开始重写了这些调用:

来自

@Styles.Render("~/Content/css")
@Scripts.Render("~/bundles/modernizr")
@Scripts.Render("~/bundles/jquery")
@Scripts.Render("~/bundles/bootstrap")
@Scripts.Render("~/Scripts/jquery-2.2.0.min.js")
@Styles.Render("~/Content/Site.css")
@Styles.Render("~/Content/Slick/slick.css")
@Styles.Render("~/Content/Slick/slick-theme.css")
@Scripts.Render("~/Scripts/Slick/slick.min.js")

@Styles.Render("~/Content/css")
@Styles.Render("~/Content/Slick/slick.css")
@Styles.Render("~/Content/Slick/slick-theme.css")
@Scripts.Render("~/Scripts/jquery-2.2.0.min.js")
@Scripts.Render("~/Scripts/Slick/slick.min.js")
<link rel="Stylesheet" href="@Url.Content("~/Content/Site.css")" />

现在当我必须在本地调试时,我在 web.config 中注释规则,因为 localhost 不接受 HTTPS。我可以在规则中添加一个条件来否定本地主机地址,但暂时不想修改此文件。