【问题标题】:Redirect to the same path in a different domain重定向到不同域中的相同路径
【发布时间】:2018-07-04 16:18:31
【问题描述】:

如何通过https://www.A.net/404.html 将某个页面Page.html 的所有https://www.A.net/Page.html 请求重定向到另一个域https://www.B.net/Page.html 上的相应页面? Github/Gitlab Pages 将所有 Page-not-found 错误重定向到后者。是否有可能以某种方式检索原始请求页面并在 Javascript 函数中使用它来修改重定向 URL?

我目前使用类似于以下 HTML 代码的东西进行多对一重定向,但我更需要一对一重定向(即不总是到同一个 https://www.B.net/404.html)。

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8"/>
        <meta http-equiv="refresh" content="0; URL=https://www.B.net/404.html">
        <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/>
        <meta name="viewport" content="width=device-width; initial-scale=1.0"/>
    </head>
    <body>
        You are being redirected to https://www.B.net/404.html <a href="https://www.B.net/404.html">https://www.B.net/404.html</a>
    </body>
</html>

现状(多对一):

www.A.net/Page1.html -> www.A.net/404.html -> www.B.net/404.html
www.A.net/Page2.html -> www.A.net/404.html -> www.B.net/404.html

理想情况(一对一):

www.A.net/Page1.html -> www.A.net/404.html -> www.B.net/Page1.html
www.A.net/Page2.html -> www.A.net/404.html -> www.B.net/Page2.html

注意我在 Github/Gitlab 托管静态网站。

特定上下文:我想将我的 Gitlab 和 Bitbucket 页面重定向到我的 Github 页面。

【问题讨论】:

    标签: javascript html redirect url-redirection


    【解决方案1】:

    您可以通过 Javascript 访问引荐来源网址,在那里对其进行解析并相应地重定向。

    例如

    <script>
         let referrer = new URL(document.referrer);
         let hostRedirection = 'http://exampleB.com';
    
         document.location.href = hostRedirection + referrer.pathname;
    </script>
    

    由于我使用的是URL,因此它与 IE 不兼容(但它与 Edge 兼容),尽管它非常简洁易读。使用regexp shouldn't be too hard 进行操作。

    强烈建议在未设置引荐来源网址的情况下添加一些错误处理。

    【讨论】:

    • 在 Chrome 和 Firefox 中,我为 URL 构造获得了 TypeError,因为 document.referrer""。不过,我猜这是您手动输入路径而不是单击链接时的行为。
    • @Matthias 如果你自己写链接,你显然没有推荐人
    • 我知道,但我也想处理这种情况(即从 href 重定向 + 手动编写)。 :-)
    • @Matthias 就像编写检查以查看是否未设置引荐来源网址一样简单。这就是我在答案的最后一行中提出的建议。祝你好运!
    【解决方案2】:

    您不能在纯 Javascript 级别上执行此操作。这是因为运行在客户端的 Javascripts 出于安全原因无法访问浏览器历史记录。

    如果你在服务器端,你可以在生成www.A.net/404.html的代码上使用Referer: HTTP-Header,生成这样一个404页面,重定向到你想要的目的地。

    请注意,如果您在客户端执行此类操作,显然会被认为是更糟糕的解决方案。它们速度较慢,使您的网站依赖于 Javascript,爬虫也无法跟踪它(如果它们不够聪明,无法执行网站的 javascript),等等。

    如果您学习一些服务器端编程语言/框架并使用它会更好;尽管纯客户端解决方案也很常见。

    【讨论】:

    • 在另一个Q&A 中,我读到了一些关于window.location 的内容,其中包含未找到的URL。不确定这具体意味着什么,以及这是否仅适用于 Github Pages。
    • @Matthias 有很多技巧可以做到这一点,例如,您可以使 404.html 依赖于原始 url(例如,404.html?url=Page1.html),这样您就可以从你的window.location。但所有这些都需要一些服务器端技巧。可以确定的是:对于客户端 javascript,以前访问过的 URL 是隐藏的,不管你做什么。您需要找到一些服务器端技巧来将此信息传递给他们。
    • document.referrer: [...]Returns the URI of the page that linked to this page.[...]。但是可能没有设置 JavaScript document.referrerRefere 标头,或者可能仅包含部分信息,具体取决于浏览器设置。 @Matthias
    • @t.niese 我从来没有工作过。在古代,甚至window.history 都可以用于客户端JS,现在只有history.back() 可以使用。你的医生多大了?
    猜你喜欢
    • 1970-01-01
    • 2011-08-16
    • 1970-01-01
    • 2016-10-07
    • 2017-01-10
    • 2012-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多