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

Nginx URL重写需求:保持浏览器URL不变,映射至指定子目录

解决Nginx内部重写URL至子目录且保持地址栏不变的问题

没问题,我帮你调整Nginx配置来实现这个需求!你要的是内部跳转(浏览器地址栏保持原URL不变),把所有符合/test/article/[含连字符的任意内容]的请求转到/test/的页面,对吧?

首先,先指出你原配置的两个小问题:

  • root放在location里会导致文件路径拼接错误:原配置中root /var/www/example.com/test,当请求/test/article/article-name时,Nginx会去查找/var/www/example.com/test/test/article/article-name,这显然不是你要的路径。
  • 缺少专门的内部重写规则,仅靠try_files无法实现你要的URL模式跳转。

下面是修正后的完整配置,我会逐段解释:

server {
    listen 80;
    server_name www.example.com;
    # 把root放在server级别,确保所有请求的文件路径基于这个根目录
    root /var/www/example.com;
    index index.html;

    # 匹配所有符合/test/article/[含连字符的任意内容]的请求
    # 正则[\w-]+表示匹配字母、数字、下划线、连字符组成的任意长度内容
    location ~^/test/article/[\w-]+$ {
        # 内部重写请求到/test/,last参数让Nginx重新匹配新URL的location规则
        # 这一步是实现地址栏不变的关键,属于内部跳转而非外部重定向
        rewrite ^ /test/ last;
    }

    # 处理/test/路径下的正常请求,确保index.html能正确加载
    location /test/ {
        try_files $uri $uri/ /test/index.html;
    }
}

关键部分说明:

  1. 正则匹配规则:~^/test/article/[\w-]+$精准匹配你要的URL模式——必须以/test/article/开头,后面跟着任意含连字符的内容(比如article-name-123这种都能匹配),避免误匹配其他路径。
  2. 内部重写:rewrite ^ /test/ last;是核心,它会把当前请求的URL在Nginx内部重写成/test/,同时让浏览器地址栏保持原URL不变。last参数告诉Nginx用新的URL重新匹配后续的location规则,这样就会触发下面的location /test/来加载对应的index.html。
  3. root路径修正:把root放在server级别后,/test/index.html会正确对应服务器上的/var/www/example.com/test/index.html,解决了原配置的路径错误问题。

测试一下:当用户访问http://www.example.com/test/article/my-awesome-article时,浏览器地址栏还是这个URL,但实际加载的是/test/index.html的内容,完全符合你的需求!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:35:20