Nginx 中的重写规则

Nginx 中的重写规则

我正在考虑迁移到 Nginx,但我想问一下是否可以将 URL 重写到该模式中,以及您是否能帮我一点忙:

  • 类似这样的网址example.com/用户名进入profile.php?u=用户名。但是,我在访问其他页面(例如 home.php)时会遇到问题吗?

  • 类似这样的网址example.com/questions/102039/that-question进入问题.php?quid=102039

非常感谢!

答案1

如果“用户名”仅由字母和数字组成,没有.s 或/s,那么您可以创建类似的规则

rewrite ^/([A-Za-z0-9]+)$ /profile.php?u=$1 last;

该命令的前半部分是来自客户端的请求。后半部分是我们希望将该请求转换为的内容。 last表示停止尝试重写此请求。

如果您不熟悉正则表达式,[A-Za-z0-9]本质上是指 A 和 Z 或 a 和 z 或 0 和 9 之间的一个字符。+之后的扩展表示“连续至少一个的字符串”。通过将其包装在内,()我们可以保存该字符串,并$1在后半部分中引用它(如果我们有多组括号,则第二组将是 $2,依此类推)。最后,表示^请求的开头,表示结尾。因此,由于中间有 ,因此不会重写$的请求,/home.php因为它不是以 / 开头,后面跟着一串字母和数字,直到 URL 末尾。.

我见过人们使用

if (!-e $request_filename) {
  rewrite ...;
}

它解决了“如果真的有一个名为该文件怎么办”的问题,而无需依赖特定的用户名模式。

第二个可能是

rewrite ^/questions/([0-9]+)/ /questions.php?quid=$1 last;

请注意,这个没有使用$,因为我们不关心 URL 如何结束,我们需要的只是它以 开头/questions/并带有数字,后跟斜杠。

您可以阅读更多有关 nginix 重写功能的内容这里

相关内容