Назад | Перейти на главную страницу

Преобразование htaccess в правила перезаписи Nginx

Мне нужно преобразовать перенаправление .htaccess в Nginx conf.

Вот .htaccess

Redirect 301 /wp-content/plugins/zendesk-for-woocommerce/api/redirect-test1.html /wp-content/plugins/zendesk-for-woocommerce/api/redirect-test2.html

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ %{ENV:BASE}index.php [QSA,L]
DirectoryIndex index.html index.htm index.php index.shtml

Вот соответствующий раздел моей конфигурации Nginx

location / {
   root   /var/www/vhosts/sitename/httpdocs;
   index  index.php index.html index.htm;
   try_files $uri $uri/ /index.php?$args;
}

Согласно руководству, которое я нашел в Интернете, я изменил его на:

location / {
    root   /var/www/vhosts/sitename/httpdocs;
    index  index.php index.html index.htm;
    try_files $uri $uri/ /index.php?$args;
    if (!-e $request_filename){
       rewrite ^(.*)$ /$env_base index.php break;
}
}

Я получаю сообщение об ошибке:

nginx: [emerg] invalid number of arguments in "rewrite" directive in /etc/nginx/conf.d/sitename.conf:19

nginx: configuration file /etc/nginx/nginx.conf test failed

Попробуйте что-нибудь вроде:

location /wp-content/plugins/zendesk-for-woocommerce/api {
  if (!-e $request_filename){
  rewrite ^(.*)$ /wp-content/plugins/zendesk-for-woocommerce/api/index.php;
 }
}

Предполагая, что у вас есть рабочее основное местоположение / блок, который будет обрабатывать запросы * .php, такие как упомянутый drookie, этот блок может быть внутри. Возможно, у вас уже есть файлы try_files, определенные в этом основном блоке.

$ Env_base внутри перезаписи не будет работать, поскольку это не переменная NGINX. Похоже, что предлагаемое преобразование в NGINX было выполнено через http://winginx.com/ или аналогичный, который не учитывает переменные Apache, такие как% {ENV: BASE} в .htaccess. Преодолеть этот кусок было труднее всего в моем устранении неполадок.

Кроме того, вы не захотите прерывать эту перезапись, поскольку NGINX перестанет обрабатывать.

Очевидно, что каждая установка немного отличается. Пытаясь заставить это работать, я понял, что неправильное преобразование ведет к различным путям устранения неполадок, и подумал, что% {ENV: BASE} может быть провалом, который приведет меня в неправильном направлении. Кроме того, переоценивая, как только я преодолел это препятствие, я хотел ограничить его конкретным путем, а не оставлять его широко открытым.

Надеюсь, это поможет.

Попробуй это:

location / {
    root /var/www/vhosts/sitename/httpdocs;
    index index.php index.html index.htm;
    if (!-e $request_filename){
       rewrite ^/(.*)$ /index.php;
    }
}

break не только избыточно, но и неверно, потому что if заставит nginx завершить процесс перезаписи и отправить запрос внутри текущего местоположения (которое не знает об обработке скрипта php).

try_files это распространенный подход, когда инженер не знает, где именно находятся его файлы, он переводится на nginx в «Посмотри сюда, посмотри туда, везде посмотри и помоги нам, боже, найти те файлы, которые мы ищем». Я лично использую try_files только в ситуациях, когда большой набор файлов перемещается между двумя частями дерева и файлами действительно может находиться в любом из нескольких мест, и это прилично не известно.

Обратите внимание, что вам также потребуется расположение регулярного выражения для файлов * .php, передав их в бэкэнд fastcgi или любой другой. Это выходит за рамки вашего вопроса и этого ответа; Надеюсь, вы понимаете, о чем я.