nginx 根据 URL 部分进行重写

nginx 根据 URL 部分进行重写

我正在尝试设置 nginx 重写;我已成功设置以删除扩展:

https://example.com/accounts?id=user-123指向https://example.com/accounts.php?id=user-123仅使用try_files:

location / { try_files $uri $uri/ $uri.html $uri.php?$args; }

我想设置在此之前的第二次重写;所有用户 ID 都以 开头user-,因此example.com/user-sdgas3应该重写为example.com/accounts?id=user-sdgas3example.com/faq-abc8989as应该重写为example.com/faqpage?id=faq-abc8989asexample.com/faq-abc8989as?view=true转到example.com/faqpage?id=faq-abc8989as&view=true等等。

我尝试的只是在每个 URL 扩展的最开始处添加以下变体:

location ^/faq-(*)$ { try_files $faqpage?id=$1; }

毫无运气。这该如何做呢?

答案1

您显然不需要设置重写链(这似乎是您正在尝试的)。这将是错误的做法:

/user-123 -> /accounts?id=user-123 -> /accounts.php?id=user-123

...因为显然你可以/应该直接重写到 PHP 处理程序文件:

/user-123 -> /accounts.php?id=user-123

看起来你没有一个 PHP 入口点路由器(标准方法)。如果你这样try_files就足够了。但是由于您有许多.php处理程序文件,因此您必须使用rewrite它们。

因此:

rewrite ^/user-(.*) /accounts.php?id=user-$1 last;
rewrite ^/faq-(.*) /faq.php?id=$1 last;

# This is only needed if /index.php can handle /this or /that route
location / {
    try_files $uri $uri /index.php$is_args$args;
} 

location \.php$ {
    ... the usual stuff for PHP-FPM
}

相关内容