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 这样的路径呢?

4 回复

Node.js 中 req.urlreq.originalUrl 获取 URL 的问题

问题描述

在使用 Express 或其他基于 Node.js 的 Web 框架时,你可能会遇到一个常见问题:当你访问某个资源(如网页)时,req.urlreq.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');
});

示例代码解释

  1. 引入 Express

    const express = require('express');
    
  2. 创建应用实例

    const app = express();
    
  3. 定义路由处理程序

    • 使用 app.get('/regist', ...) 定义一个处理 /regist 路径的 GET 请求。
    • 在处理函数内部,首先检查 req.url 是否为 /favicon.ico。如果是,则忽略该请求。
    • 如果不是,则打印请求的原始 URL 并发送响应。
  4. 启动服务器

    app.listen(8000, () => {
        console.log('Server is running on port 8000');
    });
    

通过这种方式,你可以确保即使浏览器发送了 /favicon.ico 请求,也不会干扰到你对实际路径的处理。


你用的是浏览器访问的吧…

浏览器访问默认会发一个 /favicon.ico 请求…

我知道每次浏览器请求都会发一个 /favicon.ico 的请求,问题是为什么我用 req.url 输出请求路径的时候只能输出这个图标的请求,而我真正的请求地址却没有输出?
如何才能获取到真正的请求地址?

当使用 req.urlreq.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 是正确的,并且没有被缓存导致的请求重定向问题。

回到顶部