【问题标题】:Images not displayed after rewrite rule for HTTPSHTTPS 重写规则后不显示图像
【发布时间】:2016-03-18 20:35:02
【问题描述】:

我正在开发托管在 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")" />

我试图推迟重写规则,但它似乎是“永久的”,即使相关代码在 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 了!

【问题讨论】:

  • 当您尝试直接从 yourwebsite/Content/Images/Picture.png 查看图片时会得到什么?
  • 我在我的FF的F12菜单中看到了这个,它说找不到这个资源。事实上,它看起来像我在使用 HTTP 协议时找到的图片,但在使用 HTTPS 时就没有了。我的网站现在是https://myWebsite.com\Content\Images\Picures.png,我想这是从问题而来的。令人惊讶的是,当我在 web.config 中评论 url 重写并重新部署时,没有任何变化......
  • 尝试使用 Fiddler 查看浏览器尝试下载图像时的 HTTP 响应是什么。这可能会为您提供有关问题所在的更多信息。
  • 尝试将此添加到条件
  • @ChrisPietschmann 这是 Fiddler 所说的:“找不到资源”[...] 描述:HTTP 404。您正在寻找的资源(或其依赖项之一)可能已被删除,已更改名称,或暂时不可用。请查看以下 URL 并确保其拼写正确。请求的 URL:/Content/Site.css"。除了 /bundles/bootstrap 和 /bundle/jquery 之外的所有内容(css/JS/Images)都是一样的

标签: asp.net-mvc azure url-rewriting web-config


【解决方案1】:

让我们从: 我试图推迟重写规则,但它似乎是“永久的”,即使相关代码在 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 以获取图像是否正常工作(再次检查重写或重定向)

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

【讨论】:

    【解决方案2】:

    好的!我终于找到了问题。我所做的就是将此规则放在我的 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。我可以在规则中添加一个条件来否定 localhost 地址,但现在不想修改这个文件。

    【讨论】:

    • :D 很好,你已经完成了一半,首先检查 iis 中 server_name 与 http_host 之间的区别,并正确设置删除 查看文件是否可以访问
    猜你喜欢
    • 2018-09-10
    • 1970-01-01
    • 1970-01-01
    • 2016-06-19
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 2011-09-18
    • 2017-08-28
    相关资源
    最近更新 更多