我正在一个网站上展示不同的产品,用户可以通过像'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>;
}