重写规则中的问号问题

时间:2018-10-24 作者:lowtechsun

我试图重写的url如下所示。

root_domain/something/something-else/also-different-1030/?success=1289
使用这个重写规则,我试图捕获url并将其定向到ID为1289的帖子。

function my_success_rewrite_rule() {
    add_rewrite_rule( \'.+success=([0-9]+)$\', \'index.php?p=$matches[1]\', \'top\' );    
}
add_action( \'init\', \'my_success_rewrite_rule\' );
这是我为url测试的正则表达式
https://regex101.com/r/nUENTl/1/

在正则表达式中,您可以看到组1捕获post ID$matches[1]. 当我移除? 从url,它可以完美地工作并重定向任何urlsuccess=1289 在帖子的末尾ID 1289

然而,当我包括? 尽管在regex中通过指定. 对于任何字符和+ 作为任意数量的事件的量化因子,然后success 在捕获组之前的正则表达式的开头( ) 后跟a$ 标记url字符串的结尾。

要保持? 在url中,仍然重写url以显示帖子1289 在这种情况下?我不知道如何逃跑或照顾?. 使用.+\\?success, 所以逃离? 不起作用。

我也在使用Monkeyman Rewrite Analyzer 它告诉我重写规则被正确捕获了。

enter image description here

我也在使用flush_rewrite_rules( true ); 在函数中。每次保存时,我都会刷新php文件中的规则,这样可以避免手动更新仪表板中的permalinks设置页面。

此外,我没有添加重写标记,因为p 是一个公共查询变量,因此无需将其添加到WP中,因为我想通过ID获取帖子,所以我需要使用p=$matches[1] (我想,如果这是错误的想法,请纠正我,谢谢)。

编辑以更好地解释为什么我认为我需要? 在url中是这样的。url是用户单击验证链接时重定向到的url。我当然也可以省略? 从用户被重定向到的url,但我不确定这样做是否正确或正确。

if ( $verify === $verification ) {
    update_post_meta( $form_id, \'verification_id\', \'verified\', $verify );
    wp_safe_redirect( $url . \'?success=\' . $form_id );
}
因此,当验证代码正常时,我更新post-meta,然后获取用户在进行验证时使用的原始url,并添加?success=$form_id. 我认为WP可以处理这个问题,我也可以使用$_GET[\'success\'] 我必须有? 在url中。

例如,稍后我这样做是为了从我想要的帖子中输出信息。

function catch_success() {
    var_export( $_GET );
    if ( isset( $_GET[\'success\'] ) ) {
        $post_id = $_GET[\'success\'];
        $post = get_post( $post_id );
        var_export( $post );
        $user_reserved_seats = get_post_meta( $post_id, \'user_reserved_seats\', true );
        var_export( $user_reserved_seats );
    }
}
add_action( \'template_redirect\', \'catch_success\' );
最初我想,能够使用catch_success 功能我需要一个? 在url中。

但与其做所有这些,我应该忽略? 并在验证链接签出后立即重定向到我想要的帖子?

因为现在我想我有2个重定向,1个来自验证链接,然后从那里到成功链接,2个来自成功链接到相关帖子,1289。我应该直接从验证链接重定向到有问题的帖子,是吗?或者我可以省略? 还有/success=1289 使用重写规则重定向链接到1289后?

有点历史,我最近问过这个问题with this 从某种意义上说,这是一个后续行动或下一步。

1 个回复
SO网友:Tom J Nowell

这里的根本问题是对URL工作方式的误解。您在浏览器中看到的不是完整的URL,而是更容易理解的内容

例如,以以下URL为例:

http://example.com/test/?foo=bar#bananas

这里有以下说明:

通过HTTP协议http://example.com 又称作https://example.comGET HTTP请求/test/ 又称作https://example.com/test/foo=bar 又称作https://example.com/test/?foo=barWP重写规则对请求进行操作,即/test/, 所以你永远无法匹配?foo=bar URL的一部分。这个GET 参数foo 放在$_GET 大堆请注意# 组件从不发送,这部分地址完全是客户端的。

因此,为了让测试正常进行,您需要做两件事:

匹配到/something/something-else/also-different-1030/ 零件,然后检查$_GET[\'success\'] 查看其是否具有有效值

结束

相关推荐