React-Router外部链接


113

由于我正在使用react-router来处理我的React应用程序中的路由,因此我很好奇是否可以重定向到外部资源。

假设有人点击:

example.com/privacy-policy

我希望它重定向到:

example.zendesk.com/hc/en-us/articles/123456789-Privacy-Policies

我发现避免在index.html加载类似以下内容的纯JS中编写零帮助:

if ( window.location.path === "privacy-policy" ){
  window.location = "example.zendesk.com/hc/en-us/articles/123456789-Privacy-Policies"
}

您正在使用哪个React Router?
泰勒·麦金尼斯

我使用的是3.x版
埃里克Hodonsky

1
只需更改window.location.href即可进行正式重定向。
Amirhossein Mehrvarzi

2
@AmirhosseinMehrvarzi实际上没有任何意义。您能具体一点还是举个例子?另外我不确定你是否注意到了,但是这个问题已经有一个关于React&React Router的可接受答案,这就是问题所在。
Eric Hodonsky

1
@Relic您需要使用if作为条件中的URL。几天前,我遇到了类似的问题,发现这种方法简单有效。它立即重定向。可接受的答案是一个路由解决方案(虽然它违反了路由原理,但考虑到路由体系结构是用于在应用内部导航而不是用于外部导航),但它不适用于像我这样的任何环境
Amirhossein Mehrvarzi

Answers:


170

这是使用React Router重定向到外部链接的一种方法:

<Route path='/privacy-policy' component={() => { 
     window.location.href = 'https://example.com/1234'; 
     return null;
}}/>

它使用React纯组件概念将组件代码简化为一个函数,该函数无需呈现任何内容,而是将浏览器重定向到外部URL。

在React Router 3和4。


2
这可行,但我一直在寻找更优雅的可扩展解决方案。看看我想出了什么,它使我可以进一步扩展MobileApps等的重定向(不是ReactNative,真正的本机应用程序)。现在,我正在做的不是解决我的问题的正确方法,但是要解决此问题,我建议您也研究我的解决方案,如果没有其他观点。
Eric Hodonsky

1
这在我心中并不是很干净。我宁愿诚实地使用锚标签。其次,打在浏览器上的回报,你后面的按钮,然后重定向回路线example.zendesk.com/hc/en-us/articles/...
乔纳森RYS

11
为了获得更好的后退按钮行为(针对您的应用程序进行验证),请使用window.location.replace(' example.com'
MattC

1
没有任何答案,原始帖子仅询问客户端重定向,虽然意识到没有301或302类型的真正重定向支持。
Eric Hodonsky '19年

50

无需使用<Link />react-router中的组件。

如果要转到外部链接,请使用锚标记。

<a target="_blank" href="https://meetflo.zendesk.com/hc/en-us/articles/230425728-Privacy-Policies">Policies</a>

20
该任择议定书问如何做到这一点编程,不声明
埃里克Hodonsky

13
不相关且具有误导性的答案。
Priya Ranjan Singh,

1
如果您确实使用了此选项,则将其添加rel="noopener noreferrer"<a>
S ..

5
好的答案,并不是所有人都愿意,只要他们能正常工作。
FrankByte.com

39

我实际上最终构建了自己的组件。<Redirect> 它从react-router元素中获取信息,因此我可以将其保留在自己的路线中。如:

<Route
  path="/privacy-policy"
  component={ Redirect }
  loc="https://meetflo.zendesk.com/hc/en-us/articles/230425728-Privacy-Policies"
  />

如果有人好奇,这是我的组件:

import React, { Component } from "react";

export class Redirect extends Component {
  constructor( props ){
    super();
    this.state = { ...props };
  }
  componentWillMount(){
    window.location = this.state.route.loc;
  }
  render(){
    return (<section>Redirecting...</section>);
  }
}

export default Redirect;

编辑-注:这与一起使用react-router: 3.0.5,在4.x中不是那么简单


您无需做任何事情,反应是一个框架,并且框架中有很多价值。这是在react框架内如何做到的。但是,它没有考虑到可能包含在此处的浏览器历史记录模块,因此使其更加有用。另请注意,“ window.location”是1999年所做的。这只是将其添加到路由表中以进行客户端路由的一种方法。这不是一个“好的”解决方案。
埃里克·霍登斯基

在react -router v4中,您可以使用渲染代替组件
Irrech,

3
@Irrech“渲染组件”没有任何意义。如果您对问题有答案,请添加它,并详细说明如何实现。
埃里克·霍登斯基

3
@MuhammadUmer或您只使用锚标记。react-router非常严格地意味着仅在您的应用程序内进行路由。您可以不同意这个设计决定(我知道同意),但是它并没有“在1999年做得更好”,只是做了相同的事情。
worc

21

它不需要请求反应路由器。此操作可以本地完成,由浏览器提供。

只是使用 window.location

class RedirectPage extends React.Component {
  componentDidMount(){
    window.location.replace('http://www.google.com')
  }
}

1
此答案不完整,不允许抽象或与路由器有关
Eric Hodonsky

8
这是目标。它不需要请求反应路由器。此操作可以本地完成,由浏览器提供。
艾伦(Alan)

10

使用react-router的Link组件,您可以做到这一点。在“ to ”属性中,您可以指定3种数据类型:

  • 一个字符串:链接位置的字符串表示形式,通过串联该位置的路径名,搜索和哈希属性创建。
  • 一个对象:可以具有以下任何属性的对象:
    • pathname:一个字符串,代表要链接的路径。
    • search:查询参数的字符串表示形式。
    • hash:要放入URL中的哈希,例如#a-hash。
    • 状态:坚持到该位置的状态。
  • 函数:将当前位置作为参数传递给该函数的函数,该函数应以字符串或对象的形式返回位置表示形式

对于您的示例(外部链接):

https://example.zendesk.com/hc/en-us/articles/123456789-Privacy-Policies

您可以执行以下操作:

<Link to={{ pathname: "https://example.zendesk.com/hc/en-us/articles/123456789-Privacy-Policies" }} target="_blank" />

您还可以传递您想要使用的道具,例如标题,id,className等。


1
这是最简单的解决方案,效果很好。
hPNJ7MHTyg

5

使用此处的一些信息,我提出了以下组件,您可以在路由声明中使用该组件。与React Router v4兼容。

它使用的是Typescript,但转换为原生javascript应该相当简单:

interface Props {
  exact?: boolean;
  link: string;
  path: string;
  sensitive?: boolean;
  strict?: boolean;
}

const ExternalRedirect: React.FC<Props> = (props: Props) => {
  const { link, ...routeProps } = props;

  return (
    <Route
      {...routeProps}
      render={() => {
        window.location.replace(props.link);
        return null;
      }}
    />
  );
};

并用于:

<ExternalRedirect
  exact={true}
  path={'/privacy-policy'}
  link={'https://example.zendesk.com/hc/en-us/articles/123456789-Privacy-Policies'}
/>

2

我很幸运:

  <Route
    path="/example"
    component={() => {
    global.window && (global.window.location.href = 'https://example.com');
    return null;
    }}
/>


1

要扩展Alan的答案,您可以创建一个<Route/>,将<Link/>包含“ http:”或“ https:”的所有带有“ to”属性的' 重定向到正确的外部资源。

下面是一个可行的示例,可以将其直接放入您的<Router>

<Route path={['/http:', '/https:']} component={props => {
  window.location.replace(props.location.pathname.substr(1)) // substr(1) removes the preceding '/'
  return null
}}/>

0

对于V3,尽管可能适用于V4。不符合Eric的答案,我需要做更多的事情,例如处理URL上不存在“ http”的本地开发。我还将重定向到同一服务器上的另一个应用程序。

添加到路由器文件:

import RedirectOnServer from './components/RedirectOnServer';

       <Route path="/somelocalpath"
          component={RedirectOnServer}
          target="/someexternaltargetstring like cnn.com"
        />

和组件:

import React, { Component } from "react";

export class RedirectOnServer extends Component {

  constructor(props) {
    super();
    //if the prefix is http or https, we add nothing
    let prefix = window.location.host.startsWith("http") ? "" : "http://";
    //using host here, as I'm redirecting to another location on the same host
    this.target = prefix + window.location.host + props.route.target;
  }
  componentDidMount() {
    window.location.replace(this.target);
  }
  render(){
    return (
      <div>
        <br />
        <span>Redirecting to {this.target}</span>
      </div>
    );
  }
}

export default RedirectOnServer;

-1

使用带有Typescript的React会出错,因为该函数必须返回react元素,而不是void。因此,我使用了Route渲染方法(以及使用React Router v4)来做到这一点:

redirectToHomePage = (): null => {
    window.location.reload();
    return null;
  };    
<Route exact path={'/'} render={this.redirectToHomePage} />

您还可以在其他地方使用window.location.assign()window.location.replace()等等


-2

如果您正在使用服务器端借书,则可以使用StaticRouter。使用contextas props,然后<Redirect path="/somewhere" />在应用程序中添加组件。这个想法是,每当react-router匹配重定向组件时,它都会在传递给静态路由器的上下文中添加一些内容,以使您知道路径匹配重定向组件。现在,您知道自己命中了重定向,您只需检查是否这就是您要查找的重定向。然后只需通过服务器重定向即可。ctx.redirect('https://example/com')


我正在寻求一种在客户端中执行此操作的方法。如果正确完成,实际上应该在DNS级别完成。第二个是在初始服务器请求中。由于我托管在S3上,因此没有服务器端。因此,我暂时停留在我们的开发人员可以在服务级别进行重定向之前。
Eric Hodonsky

您可以做的是<Redirect push={ true } to="/pathtoredirect" />
Rei Dien

-4

我能够使用以下方法在react-router-dom中实现重定向

<Route exact path="/" component={() => <Redirect to={{ pathname: '/YourRoute' }} />} />

就我而言,我一直在寻找一种方法,当用户访问根URL时将其重定向http://myapp.com到应用程序内的其他位置http://myapp.com/newplace。所以以上帮助。


2
OP明确指出,他正在尝试重定向到外部资源,而不是同一应用程序内部的路由。
Neets

显然,我对我的用例很具体,如果他可以将其应用到他的用例中就放弃了。我的解决方案说,在我的应用程序中,他可以以此为例。
walecloud '19

1
如果您想向人们展示您的用例,请写一个关于它的博客。Stackoverflow用于回答人们的查询,而不是您的用例。此外,实现用例的正确方法是-<将重定向从=“ /”重定向到= {{pathname:'/ YourRoute'}} />
Abhas
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.