如何在 Nginx 中将位置重定向到另一个位置但不更改其 URL

如何在 Nginx 中将位置重定向到另一个位置但不更改其 URL

我正在一个网站上展示不同的产品,用户可以通过像'mydomain.com/product/1.html','mydomain.com/product/2.html'这样的网址访问不同的产品页面

但我不想直接显示这些静态 html 文件,而是首先在 mydomain.com/product.php 加载一个 php 脚本

所以我想将“mydomain.com/product/1.html”重定向到“mydomain.com/product.php”,但不更改其原始网址

我尝试了别名、try_files、return,但它们都将 url 重写为“mydomain.com/product.php”

我是 Nginx 的新手,这可能是一个非常简单的问题,但我已经尝试了几天才实现这一点。

答案1

有很多方法可以做到这一点...

最简单的就是

rewrite ^/product/ /product.php;

服务器上下文。您的原始请求 URI(即/product/1.html)将product.php作为$_SERVER['REQUEST_URI']数组项值供脚本使用。

您还可以使用rewrite指令地点上下文,这可能稍微(非常稍微)性能更高:

location /product/ {
    rewrite ^ /product.php last;
}

如果需要,您可以获取产品代码并将其product.php作为查询参数传递给您的脚本:

rewrite ^/product/(.*)\.html$ /product.php?product=$1;

或者

location /product/ {
    rewrite ^/product/(.*)\.html$ /product.php?product=$1 last;
}

这样,您的产品代码(1用于/product/1.htmlURI、2用于/product/2.htmlURI 等)将作为数组项值用于product.php脚本。$_GET['product']

您甚至可以为此定义单独的 FastCGI 处理程序:

location /product/ {
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root/product.php;
    fastcgi_pass <fastcgi_upstream_or_socket>;
}

(原始请求 URI 将通过 提供$_SERVER['REQUEST_URI']),或者如果您希望产品代码通过 提供$_GET['product']

location ~ /product/(.*)\.html$ {
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root/product.php;
    fastcgi_param QUERY_STRING product=$1;
    fastcgi_pass <fastcgi_upstream_or_socket>;
}

相关内容