#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?