PHP Wordpress 和 Nginx 配置
PHP Wordpress and Nginx Configuration
我的 Wordpress NGINX 配置发生了一些奇怪的事情。这是它的样子:
location /home {
root /var/www/html/home;
try_files $uri $uri/ /home/index.php?$args /home/index.php?q=;
}
location ~ home\/.*\.php$ {
root /var/www/html/home;
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
现在,如果我导航到:https://example.com/home/cart/?ec_page=checkout_info 并检查 $_REQUEST 和 $_SERVER 自动变量,我会发现明显的不一致:
print_r($_REQUEST) has [REQUEST_URI] => /home/cart/?ec_page=checkout_info
print_r($_GET) has [q] =>
所以对我来说似乎“很明显”我的 NGINX 配置没有正确调用 PHP,所以 $_GET 被 [ec_page] => checkout_info
填充,并且盯着我的 NGINX 规则,我有点看到它一定是因为 /home/index.php?$args
解析为 /home/index.php?/cart/?ec_page=checkout_info
或类似的废话,导致 404 错误,因此委托给 /home/index.php?q=
并且 </code> 显然是空的。 </p>
<p>正确的做法是什么?我不认为这很重要,但值得我 运行 进入这里的麻烦与 wp-easycart 插件有关,我的 wordpress 站点配置为 <code>Post name
永久链接(我不想改变)。如果我 do 将 Wordpress 的永久链接设置更改为 Plain
那么上面的 NGINX 配置似乎可以工作,但这只是因为它有效地改变了 URL 的方式,所以没有路由参数和一切成为查询字符串参数。
问题是你是如何得到 try_files $uri $uri/ /home/index.php?$args /home/index.php?q=;
的,因为它在某些方面毫无意义。
</code> 用于正则表达式捕获组,但那里有 none。所以它确实永远是空的。</p>
<p><code>$args
应与 $is_args
组合,如果没有参数则解析为空字符串,否则 ?
。
只有一种事实上的标准结构适用于包括 WordPress 在内的许多 CMS 框架,它是这样的:
try_files $uri $uri/ /index.php$is_args$args;
这是针对 WordPress 位于网站根目录的情况。
对于你的情况(在 home
子目录中):
location = /home {
return 301 /home/;
}
location /home/ {
try_files $uri $uri/ /home/index.php$is_args$args;
}
这应该足以将参数正确传播到 PHP 中的 $_GET
变量。
如果您想要优化此配置,出于性能原因,您可以查看 try_files
-less configuration。
我的 Wordpress NGINX 配置发生了一些奇怪的事情。这是它的样子:
location /home {
root /var/www/html/home;
try_files $uri $uri/ /home/index.php?$args /home/index.php?q=;
}
location ~ home\/.*\.php$ {
root /var/www/html/home;
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
现在,如果我导航到:https://example.com/home/cart/?ec_page=checkout_info 并检查 $_REQUEST 和 $_SERVER 自动变量,我会发现明显的不一致:
print_r($_REQUEST) has [REQUEST_URI] => /home/cart/?ec_page=checkout_info
print_r($_GET) has [q] =>
所以对我来说似乎“很明显”我的 NGINX 配置没有正确调用 PHP,所以 $_GET 被 [ec_page] => checkout_info
填充,并且盯着我的 NGINX 规则,我有点看到它一定是因为 /home/index.php?$args
解析为 /home/index.php?/cart/?ec_page=checkout_info
或类似的废话,导致 404 错误,因此委托给 /home/index.php?q=
并且 </code> 显然是空的。 </p>
<p>正确的做法是什么?我不认为这很重要,但值得我 运行 进入这里的麻烦与 wp-easycart 插件有关,我的 wordpress 站点配置为 <code>Post name
永久链接(我不想改变)。如果我 do 将 Wordpress 的永久链接设置更改为 Plain
那么上面的 NGINX 配置似乎可以工作,但这只是因为它有效地改变了 URL 的方式,所以没有路由参数和一切成为查询字符串参数。
问题是你是如何得到 try_files $uri $uri/ /home/index.php?$args /home/index.php?q=;
的,因为它在某些方面毫无意义。
</code> 用于正则表达式捕获组,但那里有 none。所以它确实永远是空的。</p>
<p><code>$args
应与 $is_args
组合,如果没有参数则解析为空字符串,否则 ?
。
只有一种事实上的标准结构适用于包括 WordPress 在内的许多 CMS 框架,它是这样的:
try_files $uri $uri/ /index.php$is_args$args;
这是针对 WordPress 位于网站根目录的情况。
对于你的情况(在 home
子目录中):
location = /home {
return 301 /home/;
}
location /home/ {
try_files $uri $uri/ /home/index.php$is_args$args;
}
这应该足以将参数正确传播到 PHP 中的 $_GET
变量。
如果您想要优化此配置,出于性能原因,您可以查看 try_files
-less configuration。