在 CentOS 上配置 Node.js 应用以实现跨域访问,通常涉及以下几个步骤。跨域资源共享(CORS)是一种浏览器安全机制,用于限制网页上的脚本如何与不同源的资源进行交互。为了在 Node.js 应用中允许跨域请求,你可以使用多种方法,包括设置 HTTP 头部、使用中间件或框架等。下面详细介绍几种常见的方法:
cors 中间件Express 是一个流行的 Node.js Web 框架,而 cors 是一个专门用于处理 CORS 的中间件。以下是具体步骤:
首先,确保你已经安装了 Node.js 和 npm。然后,在你的项目目录中运行以下命令安装 Express 和 cors:
npm init -y npm install express cors 创建一个名为 app.js 的文件,并添加以下代码:
const express = require('express'); const cors = require('cors'); const app = express(); // 允许所有来源访问 app.use(cors()); // 或者更细粒度的配置,例如只允许特定域名: // app.use(cors({ // origin: 'http://example.com', // methods: ['GET', 'POST', 'PUT', 'DELETE'], // allowedHeaders: ['Content-Type', 'Authorization'] // })); app.get('/', (req, res) => { res.send('Hello World!'); }); const PORT = process.env.PORT || 3000; app.listen(PORT, () => { console.log(`Server is running on port ${PORT}`); }); 在终端中运行以下命令启动服务器:
node app.js 现在,你的 Node.js 应用将在端口 3000 上运行,并允许来自所有域的跨域请求。如果需要限制特定域名,请参考上面代码中的注释部分进行配置。
如果你不想使用中间件,也可以手动在每个响应中设置 CORS 相关的 HTTP 头部。例如:
const http = require('http'); const server = http.createServer((req, res) => { // 设置 CORS 头部 res.setHeader('Access-Control-Allow-Origin', '*'); // 允许所有来源 res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS'); res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization'); if (req.method === 'OPTIONS') { // 预检请求处理 res.writeHead(200); res.end(); return; } res.end('Hello World!'); }); const PORT = process.env.PORT || 3000; server.listen(PORT, () => { console.log(`Server is running on port ${PORT}`); }); 有时,你可能希望通过 Nginx 作为反向代理来处理跨域问题,尤其是在生产环境中。这不仅可以解决 CORS 问题,还能提高性能和安全性。
在 CentOS 上安装 Nginx:
sudo yum install epel-release sudo yum install nginx 启动并启用 Nginx 服务:
sudo systemctl start nginx sudo systemctl enable nginx 编辑 Nginx 配置文件,通常位于 /etc/nginx/nginx.conf 或 /etc/nginx/conf.d/default.conf。添加以下内容:
server { listen 80; server_name your_domain.com; # 替换为你的域名或公网 IP location /api/ { proxy_pass http://localhost:3000; # Node.js 应用运行的地址和端口 proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; # 设置 CORS 头部 add_header 'Access-Control-Allow-Origin' '*' always; add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS' always; add_header 'Access-Control-Allow-Headers' 'Origin, X-Requested-With, Content-Type, Accept, Authorization' always; if ($request_method = 'OPTIONS') { add_header 'Access-Control-Allow-Origin' '*'; add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS'; add_header 'Access-Control-Allow-Headers' 'Origin, X-Requested-With, Content-Type, Accept, Authorization'; add_header 'Content-Length' 0; add_header 'Content-Type' 'text/plain charset=UTF-8'; return 200; } } } sudo nginx -t # 检查配置文件语法 sudo systemctl reload nginx # 重新加载配置 现在,Nginx 将代理所有 /api/ 路径的请求到你的 Node.js 应用,并在响应中添加必要的 CORS 头部,从而实现跨域访问。
安全性考虑:在生产环境中,尽量避免使用 Access-Control-Allow-Origin: *,而是指定允许访问的具体域名。例如:
res.setHeader('Access-Control-Allow-Origin', 'https://example.com'); 预检请求(Preflight Requests):对于某些跨域请求(如带有自定义头部或使用非简单方法的请求),浏览器会发送一个 OPTIONS 请求进行预检。确保你的服务器能够正确处理这些预检请求。
Cookie 和认证:如果需要支持携带 Cookie 或进行用户认证,确保在客户端设置 withCredentials 为 true,并在服务器端设置相应的 CORS 头部:
// 客户端(例如前端 JavaScript) fetch('http://your_domain.com/api/data', { method: 'GET', credentials: 'include' }); // 服务器端 res.setHeader('Access-Control-Allow-Origin', 'https://example.com'); res.setHeader('Access-Control-Allow-Credentials', 'true'); 通过以上方法,你应该能够在 CentOS 上的 Node.js 应用中成功实现跨域访问。根据具体需求选择合适的方法,并注意安全性配置。