![使用 nginx 将所有子目录重定向到根目录](https://linux22.com/image/631091/%E4%BD%BF%E7%94%A8%20nginx%20%E5%B0%86%E6%89%80%E6%9C%89%E5%AD%90%E7%9B%AE%E5%BD%95%E9%87%8D%E5%AE%9A%E5%90%91%E5%88%B0%E6%A0%B9%E7%9B%AE%E5%BD%95.png)
我正在网站根目录下运行 Web 应用程序。我希望所有子目录(即使存在的子目录)都指向根目录,例如example.com/anything
重定向到example.com
。
Gmail 会这样做 - 如果我在以下位置查看我的收件箱:
https://mail.google.com/mail/#inbox
我尝试去:
https://mail.google.com/mail/#inbox/some-other-place
我只是被送回https://mail.google.com/mail/#inbox
,而不是看到错误页面。
我如何在 nginx 中实现这一点?
如果我只是停留return 301...
在根位置块内,最终会陷入重定向循环。我也尝试过使用try_files
如下方法:
location / {
try_files $uri $uri/ @home;
}
location @home {
return 301 example.com;
}
这适用于不存在的文件或目录,但是,如果子目录和文件存在,nginx 仍将为其提供服务。
谢谢。
答案1
以下解决方案来自https://daviddever.net/nginx-rewrite-to-redirect-all-requests-to-root/对我有用:
server {
server_name example.com;
root /app/static/build;
index index.html;
rewrite ^\/[^/]+$ /index.html last;
location / {
root /app/static/build;
index index.html;
}
listen 443 ssl;
}
答案2
标签后面的任何内容都不会由浏览器发送到服务器,而是由浏览器中的 JS 代码处理。
如果您想使用真实路径而不是主题标签来做到这一点,您必须创建 2 个位置:
location / {
root ...;
# no redirect
}
location ~ ^/.+$ {
try_files
}
这将避免重定向循环。