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; } }
关键部分说明:
- 正则匹配规则:
~^/test/article/[\w-]+$精准匹配你要的URL模式——必须以/test/article/开头,后面跟着任意含连字符的内容(比如article-name-123这种都能匹配),避免误匹配其他路径。 - 内部重写:
rewrite ^ /test/ last;是核心,它会把当前请求的URL在Nginx内部重写成/test/,同时让浏览器地址栏保持原URL不变。last参数告诉Nginx用新的URL重新匹配后续的location规则,这样就会触发下面的location /test/来加载对应的index.html。 - 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
相关产品推荐
相关产品推荐

