如何正确重定向带有特殊字符的出站链接

时间:2019-09-13 作者:Will

我的网站上的搜索表单有几个无线电输入,供用户选择搜索查询应使用的源(除一个外,其他所有源都位于网站外部)。

我检索这些输入(搜索词和源as);

function search_redirect_form() {
  if (is_search() && ! empty( $_GET[\'simple\'] ) ) {
        if (isset($_GET[\'simple\']) && $_GET[\'simple\'] == \'dogpile\') {
            $query = $_GET["s"];
            wp_redirect(esc_url_raw(\'theurl1\'. $query));
            exit();
        } 
        if (isset($_GET[\'simple\']) && $_GET[\'simple\'] == \'askjeeves\') {
           $query =  sanitize_text_field($_GET["s"]);
            wp_redirect(esc_url(\'url3\' . $query));
            exit();  
         } 
    else { 
        $query =  sanitize_text_field($_GET["s"]);
        wp_redirect(esc_url($home_url . "?s=" . $query));
        exit();  
    }   
当用户输入特殊字符((撇号、和号))时,查询的剩余文本通常会被删除;例如:“地球风与火”最终只是“地球风”

从阅读the codex, 我认为esc\\u raw\\u url最适合使用;但这仍然会导致查询在其他搜索引擎上遭到破坏,即使用符号(&;)其中,查询的其余部分被截断。(“大地风与火”变为“大地风”)。

在这一点上,我有点奇怪,因为wp\\u redirect会进行额外的转义(通过wp_sanitize_redirect), 这可能是一个bug;但我仍然对php生疏,不确定。这也可能让人困惑,因为其他网站可能会以稍微不同的方式逃避/清理输入。

问题:

我应该在输入本身而不是URL上转义吗?)(在我的示例中围绕“s”变量)

2 个回复
最合适的回答,由SO网友:Will 整理而成

发帖后,我学到了一些东西,最重要的是,that url encoding is done differently for paths and queries 我们的一个搜索源将搜索查询视为一条路径,因此我必须使用rawurlencode作为路径;和urlencode。这就是为什么我在尝试不同的搜索引擎时收到不一致的结果。

内有一些消毒功能wp_redirect

function search_redirect_form() {
  if (is_search() && ! empty( $_GET[\'simple\'] ) ) {
       if ( isset( $_GET[\'simple\'] ) && $_GET[\'simple\'] === \'dogpile\') {
            $query = urlencode( $_GET["s"] )
            wp_redirect(esc_url(\'url1\' . $query));
            exit(); 
        }
        if ( isset( $_GET[\'simple\'] ) && $_GET[\'simple\'] === \'altavista\') {
            $query = rawurlencode( $_GET["s"] );
            wp_redirect(esc_url(\'url2\'. $query .\'/field/all/mode/all/conn/and/order/nosort\'));
            exit(); 
        }
        if ( isset( $_GET[\'simple\'] ) && $_GET[\'simple\'] === \'askjeeves\') {
            $query = urlencode( $_GET["s"] )
            wp_redirect(esc_url(\'url3\' . $query));
            exit();  
        }
        else { 
            $query = urlencode( $_GET["s"] )
            wp_redirect(esc_url($home_url . "?s=" . $query));
            exit();  
        }   
  }
} add_action( \'pre_get_posts\', \'search_redirect_form\', 1 );

SO网友:Mike Baxter

您可以尝试删除任何可能改变url的内容。我建议如下:

$str =  sanitize_text_field($_GET["s"]);
// Remove anything that is not: alphanumeric, slash, dash or space.
$query = preg_replace(\'/[^a-zA-Z0-9 \\-\\_]*/\',\'\',$str);

相关推荐

How to make a search form?

我在wordpress上迈出了第一步,新手。我发现我想制作一个具有自己风格的搜索表单,并使用一点javascript来重新标注尺寸。因此,我不知道应该如何从几个方面着手。使用get\\u search\\u form()方法检查和更改其样式是否更好?比如搜索字段类或html5 searchform<如果我的表单将有(许多)更改,那么从头开始创建自己的表单更好吗?如果最好使用get\\u search\\u form(),我会直接检查和更改样式吗?或者我是否支持html5并更改其样式?或者有没有办法将