背景: 我们使用外部服务重定向到我们的Wordpress网站上的确认页面。此服务通过我们要删除的URL字符串发送某些参数,因为它们包含私有信息。不幸的是,该服务在该方向上不可配置(即它将始终发送全套参数)。
目标: 我当前正在处理一个nginx位置块,该块应该将请求中的某些URL参数剥离到某个页面,并使用“干净的” URL重定向到同一页面。到目前为止,我已经设法摆脱了URL中不需要的参数,但是,我正在为location块的rewrite-部分而苦苦挣扎。似乎我还没有弄清楚如何在Wordpress上下文中正确重写URL。
错误说明:
使用参数?full_name=john
访问所需的URL时,nginx会正确剥离该参数并尝试重定向到页面。但是,nginx会引发404错误。
环境:
sw-nginx
代码: 我以沉思玮对Remove parameters within nginx rewrite的评论开始。 这是我到目前为止的内容:
location ^~ /confirmation/ {
if ($request_uri ~ "([^\?]*)\?(.*)full_name=([^&]*)&?(.*)") {
set $original_path $1;
set $args1 $2;
set $unwanted $3;
set $args2 $4;
set $args "";
rewrite ^(.+)$ /index.php/$original_path?$args1$args2 permanent;
}
}
我相信罪魁祸首是rewrite ^(.+)$ /index.php/$original_path?$args1$args2 permanent;
,因为我不确定如何重写这种对Wordpress友好的内容。
我非常感谢您提供的任何帮助或朝正确方向发展的指示。预先谢谢!
更新2019-07-05 :
由于@RichardSmith,我更改了代码:
location ^~ /confirmation/ {
if ($request_uri ~ "([^\?]*)\?(.*)full_name=([^&]*)&?(.*)") {
set $original_path $1;
set $args1 $2;
set $unwanted $3;
set $args2 $4;
set $args "";
rewrite ^(.+)$ $original_path?$args1$args2 permanent;
}
}
这会导致404错误(取自proxy_error_log
):
2019/07/05 11:51:13 [error] 22623#0: *39709 "/var/www/vhosts/domain.de/sub.domain.de/confirmation/index.html" is not found (2: No such file or directory), client: 109.41.XXX.XXX, server: sub.domain.de, request: "GET /confirmation/ HTTP/2.0", host: "sub.domain.de"
这看起来像预期的行为,因为该位置没有index.html
。但是,现在我必须告诉nginx不要将index.html
附加到重写的请求中。
您知道如何实现此目标吗? 预先感谢!
解决方案:
解决我的问题的方法是,我找不到一条语句来告诉nginx当找不到文件时如何工作。因此,nginx在该位置寻找index.html,但找不到它。在URL重写之后添加一个额外的if()块来解决此问题,而无需文件也可以处理位置访问。
代码:
location ^~ /confirmation/ {
if ($request_uri ~ "([^\?]*)\?(.*)full_name=([^&]*)&?(.*)") {
set $original_path $1;
set $args1 $2;
set $unwanted $3;
set $args2 $4;
set $args "";
rewrite ^(.+)$ $original_path?$args1$args2 permanent;
}
if (!-e $request_filename) {
rewrite / /index.php last;
}
}
答案 0 :(得分:0)
解决方案:
解决我的问题的方法是,我找不到一条语句来告诉nginx当找不到文件时如何工作。因此,nginx在该位置寻找index.html,但找不到它。在URL重写之后添加一个额外的if()块来解决此问题,而无需文件也可以处理位置访问。
代码:
location ^~ /confirmation/ {
if ($request_uri ~ "([^\?]*)\?(.*)full_name=([^&]*)&?(.*)") {
set $original_path $1;
set $args1 $2;
set $unwanted $3;
set $args2 $4;
set $args "";
rewrite ^(.+)$ $original_path?$args1$args2 permanent;
}
if (!-e $request_filename) {
rewrite / /index.php last;
}
}