Как можно создать правило в Nginx, чтобы адрес вида localhost:8099/home/index/alex передавался в параметр GET с именем 'url'?

Добрый день, 

Как правильно настроить правило в nginx, чтобы адрес вида <a href="http://localhost:8099/home/index/alex" rel="nofollow">localhost:8099/home/index/alex</a> обрабатывался и передавался в параметр GET['url'], так что в результате получавшаяся строка будет выглядеть как $_GET['url'] = "/home/index/alex"; 

Я нашел некоторые отдельные моменты в интернете, но не смог собрать их воедино. 

Вот как на данный момент выглядит мой конфигурационный файл: 
<pre><code class="nginx">server{
   listen 80;
   server_name _;
   root /var/www/mvc/public;
   index index.php;
   error_log /var/log/nginx/error.log;

   location / {
      try_files $uri /$uri /index.php?$query_string;
   }

   location ~ [^/]\.php(/|$) {
      fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
      fastcgi_pass fpm:9000;
      fastcgi_index index.php;
      fastcgi_split_path_info ^(.+\.php)(/.*)$;
      fastcgi_param PATH_INFO $fastcgi_path_info;
      include fastcgi_params;
      fastcgi_param HTTPS off;
      fastcgi_param APPLICATION_ENV local;
   }

}</code></pre>
  • 26 ноября 2024 г. 14:13
Ответы на вопрос 2
Чтобы настроить Nginx для обработки URL вида `localhost:8099/home/index/alex` и передавать его в параметр GET с именем `url`, вам нужно изменить конфигурацию таким образом, чтобы он перенаправлял запросы с заданным шаблоном в нужный формат. 

Вы можете использовать директиву `rewrite` для этого. Вот пример того, как можно изменить ваш конфигурационный файл:

```nginx
server {
    listen 8099;
    server_name localhost;
    root /var/www/mvc/public;
    index index.php;
    error_log /var/log/nginx/error.log;

    location / {
        # Если запрос совпадает с /home/index/можно перенаправить с подстановкой в url
        rewrite ^/home/index/(.*)$ /index.php?url=/home/index/$1 last;
        
        # Проверка файловой структуры
        try_files $uri /$uri /index.php?$query_string;
    }

    location ~ \.php$ {
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_pass fpm:9000;
        fastcgi_index index.php;
        fastcgi_split_path_info ^(.+\.php)(/.*)$;
        fastcgi_param PATH_INFO $fastcgi_path_info;
        include fastcgi_params;
        fastcgi_param HTTPS off;
        fastcgi_param APPLICATION_ENV local;
    }
}
```

Объяснение изменений:

1. Используем директиву `rewrite`, чтобы перенаправить URL в нужный формат.
   - `^/home/index/(.*)$` - это регулярное выражение, которое выбирает все, что идет после `/home/index/` и помещает это в переменную `$1`.
   - `/index.php?url=/home/index/$1` - это путь, к которому мы перенаправляем. Здесь `$1` будет заменен на соответствующее значение.
   - `last` сообщает Nginx, что после применения этого правила, он больше не должен проверять другие правила для этого запроса.

Теперь, если вы перейдете по адресу `http://localhost:8099/home/index/alex`, ваш PHP-скрипт получит `$_GET['url']` равным `/home/index/alex`. 

Не забудьте перезапустить Nginx после изменения конфигурации, чтобы изменения вступили в силу.
-      try_files $uri /$uri /index.php?$query_string;
+      try_files $uri $uri/ /index.php?url=uri&$query_string;

но сомнительная задумка, т.к. то же относительно легко вытаскивается через $_SERVER['REQUEST_URI']
Похожие вопросы