Мне нужно преобразовать перенаправление .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 или любой другой. Это выходит за рамки вашего вопроса и этого ответа; Надеюсь, вы понимаете, о чем я.