You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React路由接收查询参数的Nginx配置:SSO重定向后路由捕获处理

解决方案

一、Nginx配置(核心:让路由请求交给React处理)

React是单页应用(SPA),默认Nginx会把/my-route这类路径当成静态文件查找,导致404。必须配置Nginx,让所有非静态资源的请求都转发到index.html,才能让React Router接管路由逻辑。

修改Nginx的server配置块,添加以下规则:

server {
    listen 80;
    server_name my-react; # 你的域名或服务器IP

    root /path/to/your/react/build; # React打包后的dist/build目录路径
    index index.html;

    # 处理静态资源(CSS、JS、图片等),设置缓存优化加载
    location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
        expires 1y;
        add_header Cache-Control "public, immutable";
    }

    # 核心规则:所有非静态资源请求都指向index.html,交给React Router处理
    location / {
        try_files $uri $uri/ /index.html;
    }
}

二、React代码处理(捕获路由+解码SSO响应)

1. 配置React Router的BrowserRouter

在项目根组件(比如App.jsx)中,用BrowserRouter包裹所有路由:

import { BrowserRouter as Router, Routes, Route } from 'react-router-dom';
import MyRouteComponent from './components/MyRouteComponent';

function App() {
  return (
    <Router>
      <Routes>
        {/* 对应SSO跳转的目标路由 */}
        <Route path="/my-route" element={<MyRouteComponent />} />
        {/* 其他业务路由... */}
      </Routes>
    </Router>
  );
}

export default App;

2. 在目标路由组件中解析并解码参数

在MyRouteComponent里,用useSearchParams钩子获取URL中的response参数,完成Base64解码:

import { useEffect, useState } from 'react';
import { useSearchParams } from 'react-router-dom';

function MyRouteComponent() {
  const [searchParams] = useSearchParams();
  const [decodedData, setDecodedData] = useState(null);

  useEffect(() => {
    const responseParam = searchParams.get('response');
    if (responseParam) {
      try {
        // 处理URL安全的Base64(替换特殊字符)
        const safeBase64 = responseParam.replace(/-/g, '+').replace(/_/g, '/');
        // Base64解码
        const decodedStr = atob(safeBase64);
        // 转成JSON对象(如果SSO返回的是JSON格式)
        const responseData = JSON.parse(decodedStr);
        setDecodedData(responseData);
        
        // 这里可以添加后续逻辑:比如存储认证信息、跳转首页等
      } catch (err) {
        console.error('SSO响应解码失败:', err);
      }
    }
  }, [searchParams]);

  return (
    <div>
      {decodedData ? (
        <div>
          <h3>认证成功</h3>
          <pre>{JSON.stringify(decodedData, null, 2)}</pre>
        </div>
      ) : (
        <div>处理中...</div>
      )}
    </div>
  );
}

export default MyRouteComponent;

3. 按钮跳转SSO的代码示例

在触发登录的按钮组件中,构造正确的跳转URL:

function SSOLoginButton() {
  const handleLogin = () => {
    // 构造ssotarget:当前应用的/my-route地址
    const ssotarget = `${window.location.origin}/my-route`;
    // 跳转到SSO登录页,注意对参数编码避免乱码
    window.location.href = `http://sso-url.com/login?ssotarget=${encodeURIComponent(ssotarget)}`;
  };

  return <button onClick={handleLogin}>SSO登录</button>;
}

export default SSOLoginButton;

内容的提问来源于stack exchange,提问作者Mike Toleds

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 16:05:23