我需要将 .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
答案1
尝试这个:
location / {
root /var/www/vhosts/sitename/httpdocs;
index index.php index.html index.htm;
if (!-e $request_filename){
rewrite ^/(.*)$ /index.php;
}
}
break
不仅是多余的,而且是错误的,因为这将使 nginx 终止重写过程并将请求放到当前位置(当前位置不知道 php 脚本的处理)。
try_files
是一种常见的方法,当工程师不知道他的文件到底位于何处时,它会被翻译成 nginx“看看这里,看看那里,到处找,上帝保佑我们找到我们正在寻找的文件”我个人try_files
只在大量文件在树和文件的两个部分之间重新定位的情况下使用真的可能位于多个位置中的任意一个,并且这一点还不为人所知。
请注意,您还需要一个用于 *.php 文件的正则表达式位置,将它们传递给 fastcgi 后端或任何其他后端。这超出了您的问题和此答案的范围;我希望您明白我的意思。
答案2
尝试以下方法:
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/或类似的东西,不考虑 .htaccess 中的 %{ENV:BASE} 等 Apache 变量。解决这一部分是我故障排除中最困难的部分。
此外,您不会希望重写中断,因为 NGINX 将停止处理。
显然,每个设置都有点不同。经过一番努力,我意识到转换不当会导致各种故障排除路径,并认为 %{ENV:BASE} 可能是一个下降,这导致我走上了错误的方向。此外,在克服了这一障碍后,我重新评估,希望将其范围具体到路径,而不是保持开放。
希望这有帮助。