как перенаправить местоположение на другое, не меняя его URL в Nginx

как перенаправить местоположение на другое, не меняя его URL в Nginx

Я работаю над веб-сайтом для демонстрации различных продуктов. Пользователи могут получить доступ к различным страницам продуктов по 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.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>;
}

Связанный контент