我正在扩展Wordpress网站,以呈现非来自数据库的页面。我们希望这些页面有漂亮的URL,URL中没有参数。
假设我们在卖苹果:我希望URL是http://myfictionalstore.com/apple/golden-delicious
或http://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 ...;
...
}