【问题标题】:How to redirect invalid url to a valid url in nginx?如何将无效的 url 重定向到 nginx 中的有效 url?
【发布时间】:2015-01-12 02:27:29
【问题描述】:

我有一个http://example.com/valid/ 类型的有效网址。使用 nginx 如何将http://example.com/valid/dsdhshd 类型的 url 重定向到我的有效 url?

我试过了:

location /valid/ {
    resolver 8.8.8.8;
    proxy_pass http://example.com/valid/;
    proxy_redirect off;
}

但它给出了 500 内部服务器错误。

我也尝试了位置return 301 $scheme://example.com/valid/;,但这只会让我陷入无限重定向循环。

【问题讨论】:

  • 如果要防止重定向循环,创建一个新位置location = /valid
  • 是那些简单的 html 文件,还是有处理这个的后端? (php, python, ruby​​)
  • @MohammadAbuShady 它们是简单的 html、css 和 js 文件

标签: nginx


【解决方案1】:

如果您想将重定向发送到客户端,请不要代理请求,只需发送即可。

server {
    # Your server configuration ...

    # Enclose regular expressions in default location.
    location / {

        location /valid {
            location ~ /valid/.+ {
                try_files $uri @invalid;
            }

            # Handle the request to the valid URL ...
        }

    }

    location @invalid {
        return 301 $scheme://$server_name/valid;
    }
}

这应该可以解决问题。你确实得到了一个重定向循环,因为你的位置块也匹配了/valid/ URL 本身,这是你不想匹配的。您只想匹配在该字符串之后具有某些内容的 URL,例如/valid/foo。这正是上面位置块中的正则表达式所要确保的。

【讨论】:

  • 但是如果出现example.com/valid/css/main.css 类型的网址怎么办。在这种情况下,它也会被退回。
  • 您需要一个模式来识别哪些 URL 是无效的,哪些是有效的,并创建一个正则表达式来确保您准确无误。
  • 我为此使用这个正则表达式~* \.(favicon\.ico|ico|css|js|gif|jpe?g|png)$。我可以在这里以某种方式使用它吗?
  • @invalid 是与try_files 指令一起使用的命名位置块。 try_files 指令检查请求的 URL 是否实际上是存在于服务器上的静态文件,如果是则将简单地传递它(无论这是 ICO、PNG 还是其他)。如果请求的 URL 不指向文件,它会继续到指定位置 @invalid,这会产生 301 返回。完成:)
  • location /valid {,因为最后一个斜杠后没有字符,并且请求指向一个目录。 Nginx 将在目录中查找索引文档或代理它,如果您的位置配置为这样做。您绝对应该阅读有关此类问题的 nginx 文档。
【解决方案2】:

这是一个我可以考虑的示例

server {
  location /valid {
    try_files $uri $uri/ @redirect_invalid;
  }
  location @redirect_invalid {
    return 301 $scheme://$server_name/valid;
  }
}

但这将是非常具体的,如果有很多文件夹需要单独添加,我想不出一种方法可以使所有文件夹都通用,也许其他人可以帮助我。

【讨论】:

  • 关于$http_host:不要在配置中使用用户提供的变量。它们很慢(解析)并且不安全。您的配置不允许他处理对/valid 的请求,因为您的try_files 将直接转到指定位置。
  • 如果我的服务器名称类似于server_name localhost example.com;,那会很奇怪
  • 在这种情况下使用 $hostname 由 nginx 为您生成。
  • /valid 的请求将匹配$uri/$uri,具体取决于它是文件夹还是文件
  • 这需要额外的 location 块来配置并膨胀你的配置。 ;)
猜你喜欢
  • 1970-01-01
  • 2022-01-14
  • 2017-05-08
  • 1970-01-01
  • 2021-04-16
  • 1970-01-01
  • 1970-01-01
  • 2012-01-05
相关资源
最近更新 更多