![Nginx 中的重写规则](https://linux22.com/image/528647/Nginx%20%E4%B8%AD%E7%9A%84%E9%87%8D%E5%86%99%E8%A7%84%E5%88%99.png)
我正在考虑迁移到 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 重写功能的内容这里。