Nodejs 为什么我用 req.url 和 req.originalUrl 获取 url 得到的却是 /favicon.ico?
Nodejs 为什么我用 req.url 和 req.originalUrl 获取 url 得到的却是 /favicon.ico?
为什么我用 req.url 和 req.originalUrl 获取 url 得到的却是 /favicon.ico?
如何才能够获取到 “http://localhost:8000/regist” 里的 /regist 这样的路径呢?
Node.js 中 req.url
和 req.originalUrl
获取 URL 的问题
问题描述
在使用 Express 或其他基于 Node.js 的 Web 框架时,你可能会遇到一个常见问题:当你访问某个资源(如网页)时,req.url
和 req.originalUrl
返回的是 /favicon.ico
而不是你实际请求的路径。
原因分析
这个问题通常发生在浏览器尝试加载网站的 favicon 时。浏览器会自动发送一个对 /favicon.ico
的请求,以显示页面标签中的图标。当你的服务器没有正确处理这个请求时,它就会返回 /favicon.ico
。
解决方案
你可以通过检查请求是否为 favicon 请求,并相应地进行处理。以下是一个简单的示例代码来说明如何实现这一点:
const express = require('express');
const app = express();
app.get('/regist', (req, res) => {
if (req.url === '/favicon.ico') {
// 忽略 favicon 请求
return;
}
console.log(`Request for ${req.originalUrl}`);
res.send('regist page');
});
app.listen(8000, () => {
console.log('Server is running on port 8000');
});
示例代码解释
-
引入 Express:
const express = require('express');
-
创建应用实例:
const app = express();
-
定义路由处理程序:
- 使用
app.get('/regist', ...)
定义一个处理/regist
路径的 GET 请求。 - 在处理函数内部,首先检查
req.url
是否为/favicon.ico
。如果是,则忽略该请求。 - 如果不是,则打印请求的原始 URL 并发送响应。
- 使用
-
启动服务器:
app.listen(8000, () => { console.log('Server is running on port 8000'); });
通过这种方式,你可以确保即使浏览器发送了 /favicon.ico
请求,也不会干扰到你对实际路径的处理。
你用的是浏览器访问的吧…
浏览器访问默认会发一个 /favicon.ico 请求…
我知道每次浏览器请求都会发一个 /favicon.ico 的请求,问题是为什么我用 req.url 输出请求路径的时候只能输出这个图标的请求,而我真正的请求地址却没有输出?
如何才能获取到真正的请求地址?
当使用 req.url
或 req.originalUrl
获取 URL 时,如果返回的是 /favicon.ico
,这通常是因为浏览器请求了网站的 favicon(通常是网站的小图标),而服务器没有正确处理这个请求。
为了获取你想要的路径(如 /regist
),你需要确保服务器正确处理了这些请求。下面是一个简单的 Express 示例,展示如何处理这些情况:
const express = require('express');
const app = express();
app.use(express.static('public'));
// 假设你需要处理一个名为 "/regist" 的路由
app.get('/regist', (req, res) => {
console.log(req.url); // 输出: /regist
console.log(req.originalUrl); // 输出: /regist
res.send('Registration Page');
});
app.get('*', (req, res) => {
console.log(`Other request for ${req.url}`);
res.status(404).send('Not Found');
});
app.listen(8000, () => {
console.log('Server is running on port 8000');
});
在这个例子中,我们创建了一个 Express 应用来监听端口 8000,并且定义了一个处理 /regist
路由的 GET 请求。这样,当你访问 http://localhost:8000/regist
时,服务器会输出你想要的路径。
如果你的服务器在处理其他请求时返回了 /favicon.ico
,请确保你的静态文件服务配置正确,或者添加一个默认的错误处理程序来捕捉这些未处理的请求。
此外,确保你的浏览器请求的 URL 是正确的,并且没有被缓存导致的请求重定向问题。