使用 nginx 将所有子目录重定向到根目录

使用 nginx 将所有子目录重定向到根目录

我正在网站根目录下运行 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
}

这将避免重定向循环。

相关内容