如何在 web.config 文件中为特定文件类型创建重定向?

Posted

技术标签:

【中文标题】如何在 web.config 文件中为特定文件类型创建重定向?【英文标题】:How to create a redirect in a web.config file for a specific file type? 【发布时间】:2014-07-29 22:02:39 【问题描述】:

我有一个包含数千个 mp3 文件的大型播客网站。我在 Windows Azure 上运行 Wordpress。我最近移动了服务器并更改了 url 结构。

过去所有的mp3文件都被引用(粗略的例子,有几千个文件)

位于 http://www.domain.com/podcasts/podcastname/filename.mp3 -

它们现在位于 http://downloadtracker.domain.com/podcasts/podcastname/filename.mp3

唯一的区别是子域从“www”变为“downloadtracker”

我已经手动修复了所有内部链接 - 但有许多我无法控制的入站链接。我想做的是在 web.config 中创建一个规则,嗅探对 mp3 文件的请求并将请求重定向到新的子域。我希望它为每个 mp3 文件自动重定向(我不必手动编码每个 mp3 路径)

我没有看到根据 web.config 中的文件类型进行嗅探和重定向的方法。这可能吗?

【问题讨论】:

这不应该与 wordpress 或 azure 相关(删除标签?)。您是指目标 URI 的 downloadtracker.domain.com/podcasts/podcastname/filename.mp3 吗?你看过 IIS 重写规则吗? 这是一个在 Azure 上运行的 wordpress 站点 - 我确实希望将 downloadtracker.domain.com/podcasts/podcastname/filename.mp3 重定向到用户的位置。 我没有看过 IIW 重写规则,只是 web.config 的 【参考方案1】:

以下重写规则将所有请求重定向到具有您描述的路径模式的 MP3 文件到新主机。

<rule name="redirect MP3s" stopProcessing="true">
    <match url="^podcasts/.*/.*.mp3$" />
    <conditions>
        <add input="HTTP_HOST" pattern="downloadtracker.domain.com" ignoreCase="true" negate="true" />
    </conditions>
    <action type="Redirect" url="http://downloadtracker.domain.com/R:0" redirectType="Permanent" />
</rule>

请注意,如果www.domain.comdownloadtracker.domain.com 都托管在同一个IIS 实例上,条件(检查主机是否还没有我们要重定向到的位置)会阻止重定向循环。如果不是这种情况,可以省略条件。

另外请注意,如果措施只是临时的并且您不希望将希望客户记住新位置。

【讨论】:

【参考方案2】:

如果 IIS 难以为该重定向配置,您最终可以考虑使用反向代理,例如 apache 服务器。 Apache 擅长反向代理,即将发送到一个 URL 的所有流量透明地转发到另一个。

从模块mod_proxy上的apache 2.4文档中提取,指令ProxyPass

Suppose the local server has address http://example.com/; then

<Location /mirror/foo/>
    ProxyPass http://backend.example.com/
</Location>

will cause a local request for http://example.com/mirror/foo/bar to be internally converted into a proxy request to http://backend.example.com/bar.

因此,您只需安装一个监听 www.domain.com 的 Apache 服务器。魔术指令将是:

<Location /podcasts/podcastname/>
    ProxyPass http://downloadtracker.domain.com/podcasts/podcastname/
</Location>

出于安全原因、负载平衡等原因,目前在大型数据中心拥有反向代理...

编辑: 我必须承认,只有当您已经在生产环境中拥有(或计划拥有)此类反向代理时,所有这些才有意义。如果您使用其他反向代理,例如nginx,它也应该很容易。当然,我没有反向代理,也不需要,最好坚持使用 IIS 解决方案。但是,如果您有大量流量或强烈的安全问题,也许它会很有用。

【讨论】:

【参考方案3】:

我没有加载虚拟机来测试这个,但类似于下面的重写规则应该可以工作。 URL 可能需要是相对的而不是绝对的。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <system.webServer>
        <rewrite>
            <rules>
                <rule name="Rule Name" stopProcessing="true">
                    <match url="http://www.domain.com/podcasts/podcastname/filename.mp3" />
                    <action type="Rewrite" url="http://downloadtracker.domain.com/podcasts/podcastname.mp3" />
                </rule>
            </rules>
        </rewrite>
    </system.webServer>
</configuration>

【讨论】:

这对每个 mp3 文件都有效吗?我正在尝试对 mp3 文件的每个请求进行重定向(有几千个)。 对于您需要执行的每个 mp3 文件 我怎样才能既匹配 mp3 又将其重定向到相同的路径,但使用不同的域名? 它将在操作 url 中涉及类似 c:0 的内容,以从传入的 url 获取参数。看看这个答案:***.com/a/22146028/540339 它可能为您提供了一种定义规则的方法。 我还没有看到那个答案 - 我昨天大部分时间都在试图找到 R0,C1 值的正确组合。对于 MS 来说,这是一个奇怪的差距。

以上是关于如何在 web.config 文件中为特定文件类型创建重定向?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Visual Studio 中为自定义配置文件添加配置转换?

我可以在 web.config 中为 maxJsonLength 设置无限长度吗?

如何在 VS Code 中为特定文件禁用自动换行?

如何通过web.config文件中的Access-Control-Allow-Origin允许多个源域?

Web.config 允许特定用户访问位置

git 中的 web.config 和 app.config 机器特定设置