![如何在 Nginx 中将位置重定向到另一个位置但不更改其 URL](https://linux22.com/image/770072/%E5%A6%82%E4%BD%95%E5%9C%A8%20Nginx%20%E4%B8%AD%E5%B0%86%E4%BD%8D%E7%BD%AE%E9%87%8D%E5%AE%9A%E5%90%91%E5%88%B0%E5%8F%A6%E4%B8%80%E4%B8%AA%E4%BD%8D%E7%BD%AE%E4%BD%86%E4%B8%8D%E6%9B%B4%E6%94%B9%E5%85%B6%20URL.png)
我正在一个网站上展示不同的产品,用户可以通过像'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.html
URI、2
用于/product/2.html
URI 等)将作为数组项值用于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>;
}