如何在Wordpress中修改nginx$args并重定向到修改后的URL后修复404错误

如何在Wordpress中修改nginx$args并重定向到修改后的URL后修复404错误,wordpress,nginx,url-rewriting,nginx-location,nginx-reverse-proxy,Wordpress,Nginx,Url Rewriting,Nginx Location,Nginx Reverse Proxy,背景: 我们使用外部服务重定向到Wordpress网站上的确认页面。此服务通过我们要删除的URL字符串发送某些参数,因为它们包含私有信息。不幸的是,该服务在该方向上是不可配置的(即,它将始终发送全套参数) 目标: 我目前正在处理一个nginx位置块,该块应该将请求中的某些URL参数剥离到某个页面,并重定向到具有“干净”URL的同一页面。到目前为止,我已经设法消除了URL中不需要的参数,但是,我正在努力解决位置块的重写部分。似乎我还没有弄明白如何在Wordpress上下文中正确重写URL 错误说明

背景: 我们使用外部服务重定向到Wordpress网站上的确认页面。此服务通过我们要删除的URL字符串发送某些参数,因为它们包含私有信息。不幸的是,该服务在该方向上是不可配置的(即,它将始终发送全套参数)

目标: 我目前正在处理一个nginx位置块,该块应该将请求中的某些URL参数剥离到某个页面,并重定向到具有“干净”URL的同一页面。到目前为止,我已经设法消除了URL中不需要的参数,但是,我正在努力解决位置块的重写部分。似乎我还没有弄明白如何在Wordpress上下文中正确重写URL

错误说明: 当使用param
?full_name=john
访问所需的URL时,nginx会正确地剥离param并尝试重定向到页面。但是,nginx抛出一个404错误

环境:

  • Ubuntu 16.04上的Plesk Onyx 17.8
  • Wordpress 5.2.2
  • nginx:Plesk的
    sw nginx
  • PHP:7.3.6(通过nginx的FPM)
代码: 我是从沈思危的评论开始的。 以下是我到目前为止的情况:

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错误(取自代理错误日志)

这看起来像是预期的行为,因为该位置没有
index.html
。但是,现在我必须告诉nginx不要将
index.html
附加到重写的请求中

你有办法做到这一点吗? 提前谢谢



解决方案:

我的问题的解决方案是,我缺少一条语句,告诉nginx在没有找到文件时如何工作。因此,nginx在那个地方寻找index.html,但找不到它。在URL重写之后添加一个额外的if()-块来处理无文件的位置访问

代码:


解决方案:

我的问题的解决方案是,我缺少一条语句,告诉nginx在没有找到文件时如何工作。因此,nginx在那个地方寻找index.html,但找不到它。在URL重写之后添加一个额外的if()-块来处理无文件的位置访问

代码:


解决方案:

我的问题的解决方案是,我缺少一条语句,告诉nginx在没有找到文件时如何工作。因此,nginx在那个地方寻找index.html,但找不到它。在URL重写之后添加一个额外的if()-块来处理无文件的位置访问

代码:


您将
index.php
放在URI前面,然后将原始请求作为路径信息附加。如果原始请求已经得到正确处理(尽管使用了私有信息),也许您应该从重写的URI中删除
/index.php/
部分。谢谢您的指针@RichardSmith!我现在又尝试了一点,在代理日志中发现了以下错误:
2019/07/05 11:51:13[error]22623#0:*39709”/var/www/vhosts/domain.de/sub.domain.de/term bestaetigt/index.html“找不到(2:没有这样的文件或目录),客户机:109.41.XXX.XXX,服务器:sub.domain.de,请求:“GET/term bestaetigt/HTTP/2.0”,主机:“sub.domain.de“
因此nginx试图将/index.html追加到请求中,但这无法工作,因此404到目前为止是正确的。现在我需要知道如何停止这种行为……您将
index.php
放在URI前面,然后将原始请求作为path\u info追加。如果原始请求已经得到正确处理(尽管使用了私有信息),也许您应该从重写的URI中删除
/index.php/
部分。谢谢您的指针@RichardSmith!我现在又尝试了一点,在代理日志中发现了以下错误:
2019/07/05 11:51:13[error]22623#0:*39709”/var/www/vhosts/domain.de/sub.domain.de/term bestaetigt/index.html“找不到(2:没有这样的文件或目录),客户机:109.41.XXX.XXX,服务器:sub.domain.de,请求:“GET/term bestaetigt/HTTP/2.0”,主机:“sub.domain.de”
因此nginx试图将/index.html追加到请求中,但这无法工作,因此404到目前为止是正确的。现在我需要知道如何停止这种行为。。。
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"
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;
    }
}
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;
    }
}