使用Nginx在Wordpress URL中嵌入查询参数


Embedding query parameters in Wordpress urls with Nginx

我正在扩展Wordpress网站,以呈现非来自数据库的页面。我们希望这些页面有漂亮的URL,URL中没有参数。

假设我们在卖苹果:我希望URL是http://myfictionalstore.com/apple/golden-delicioushttp://myfictionalstore.com/apple/granny-smith

我无法使这种风格的URL工作

在引擎盖下,我们可以将URL传递给页面模板,该模板从API获取与苹果相关的信息,因此我们可以很高兴地呈现这样的页面:

http://myfictionalstore.com/apple/?apple=granny-smith

我已经告诉WordPress我的新查询变量:

function add_query_vars($aVars) {
$aVars[] = "apple";
 return $aVars;
}
add_filter('query_vars', 'add_query_vars');

在模板中,我可以很高兴地使用:

$apple_key = get_query_var( 'apple', 'rotten' ) ;

我不能做的是配置Nginx进行内部重定向,这样它就可以呈现漂亮的URL。尽管它在上面工作,但这个Nginx配置不:

location ~ /apple/([^/]+)/? {
    try_files /dev/null /index.php?pagename=apple&apple=$1;
}

当我尝试查询其中一个漂亮的URL时,该配置返回404。我可以只使用WordPress查询变量进行查询:

http://myfictionalstore.com/index.php?pagename=apple&apple=orange-pippin

但无论出于何种原因,这都不能作为内部重定向。我可以使用phpinfo()来证明参数正在进入WordPress:

QUERY_STRING pagename=apple&apple=braeburn

也许:

  • WordPress不喜欢请求环境吗
  • Nginx没有正确处理内部重定向

墙上有个凹痕,我的前额在流血。

更新:

多亏了Richard,这才成功:

  location ~ /apple/([^/]+)/? {
    fastcgi_pass unix:/var/run/hhvm/hhvm.sock;
    include /etc/nginx/fastcgi_params;
    fastcgi_param SCRIPT_FILENAME /var/www/index.php;
    fastcgi_param REQUEST_URI     /index.php;
    fastcgi_param QUERY_STRING    page_id=12345&apple=$1&;
    fastcgi_pass_request_headers off;
  }

通过Wordpress page_name加载页面时出现问题,所以我最终稍微更改了查询;这是向前迈出的一步,然后删除原始的请求头就可以了。谢谢

这与其说是答案,不如说是一个建议。nginx内部重定向不重写$request_uri,后者稍后用于为WordPress设置REQUEST_URI。WordPress可能使用REQUEST_URI而不是QUERY_STRING来支持漂亮的永久链接

显而易见的解决方案是让WordPress在内部处理您的漂亮的永久链接,但对于您的特定实现来说,这可能不是一个实用的解决方案。

另一种解决方案是将REQUEST_URI的值更改为:

fastcgi_param  REQUEST_URI $uri$is_args$args;

以便它匹配内部重写的值,而不是外部呈现的值。这是一个全球性的变化,需要广泛的测试。

如果遇到问题,第三种解决方案是在新位置复制一个自定义php代码块。例如:

location ~ /apple/([^/]+)/? {
  fastcgi_param SCRIPT_FILENAME $document_root/index.php;
  fastcgi_param REQUEST_URI     /index.php?pagename=apple&apple=$1;
  fastcgi_pass ...;
  ...
}