Преобразование Apache .htaccess в директивы Nginx

#nginx #url #url-rewriting #nginx-config

#nginx #url #url-переписывание #nginx-config

Вопрос:

Я годами запускаю свой сайт на Apache, и с тех пор, как я перешел на Nginx для повышения скорости, мои правила перезаписи htaccess нарушили работу моего сайта.

Содержимое моего сайта подается динамически на основе запроса URL-адреса — вот как мой файл htaccess ищет / traffic.

 RewriteEngine on
RewriteRule ^([a-zA-Z0-9-z-_] )/$ index.php?first_path=$1 [QSA]
  

Это передаст любой каталог в качестве параметра first_path в index.php .

Читая документацию Nginx по реструктуризации URL, я, похоже, не могу понять, как написать свои требования.

Любые идеи помогут.

Комментарии:

1. Вы могли бы использовать что-то вроде: rewrite ^/([a-zA-Z0-9_-] )/$ /index.php?first_path=$1 last;

2. @RichardSmith, вы записываете это где-то конкретно в файле nginx.conf между каким-то блоком? или просто сам по себе внизу страницы?

Ответ №1:

Возможно, вам повезет с онлайн-конвертерами, подобными этому, которые специально для вас .htaccess будут производить:

 server {
    server_name example.com;
    rewrite ^/([a-zA-Z0-9-z-_] )/$ /index.php?first_path=$1;
}
  

Естественно, вы также должны включить местоположение «обработчика» для обработки PHP, чтобы более полная конфигурация была:

 server {
    server_name example.com;

    rewrite ^/([a-zA-Z0-9-z-_] )/$ /index.php?first_path=$1;

    location ~ .php$ {
        fastcgi_pass  unix:/path/to/php-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }

}
  

Однако стоит отметить, что сам создатель NGINX, Игорь Сысоев, не поддерживает использование rewrite директив, отвергая их использование в старые времена, когда вложенные расположения не поддерживались.

Вложенные расположения, согласно автору NGINX, позволяют изолировать регулярное выражение, создавая конфигурацию, которую легче поддерживать в будущем (хотя сначала не обязательно легче создавать). Таким образом, в этом случае, используя вложенное расположение, одна и та же конфигурация может выглядеть следующим образом:

 server {
    server_name example.com;

    location / { 

        location ~ ^/(?<dir>[a-zA-Z0-9-z-_] )/$ {
            fastcgi_pass  unix:/path/to/php-fpm.sock;
            fastcgi_param SCRIPT_FILENAME /path/to/index.php;
            fastcgi_param QUERY_STRING first_path=$dir
            include fastcgi_params;
        }

    }

    location ~ .php$ {
        fastcgi_pass  unix:/path/to/php-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }

}
  

Комментарии:

1. Выглядит хорошо, но мне все еще трудно разобраться в этом. Я поместил это в свой файл conf и заменил требуемые поля, но перенаправление моего URL-адреса по-прежнему не выполняется. Я где-то читал, что файл должен включать ngx_http_rewrite_module, верно? Потому что мой файл этого не показывает

2. Конфигурация NGINX обычно состоит из множества файлов, и стандартным соглашением является наличие /etc/nginx/sites-enabled/example.com.conf файлов для специфичной для сайта логики. Убедитесь, что они включены в случае, если вы их используете ( nginx -T для сброса полной конфигурации). ngx_http_rewrite_module Не нужно включать, если вы установили NGINX из пакетов, он включен / включен.

3. Отлично, большое спасибо! Теперь у меня все работает нормально. У меня такой же URL htaccess, перезаписанный для других каталогов, что мне написать для другого блока location?