
Я работаю над веб-сайтом для демонстрации различных продуктов. Пользователи могут получить доступ к различным страницам продуктов по URL-адресам типа «mydomain.com/product/1.html», «mydomain.com/product/2.html».
но я не хочу представлять эти статические HTML-файлы напрямую, вместо этого сначала будет загружен PHP-скрипт на mydomain.com/product.php
поэтому я хочу перенаправить «mydomain.com/product/1.html» на «mydomain.com/product.php», но не менять его исходный URL
Я пробовал alias, try_files, return, но все они переписывают URL на 'mydomain.com/product.php'
Я новичок в Nginx, это, вероятно, очень простой вопрос, но я пытаюсь добиться этого уже пару дней.
решение1
Есть так много способов сделать это...
Самый простой - это
rewrite ^/product/ /product.php;
всерверcontext. Ваш исходный 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>;
}