【问题标题】:Keep query string for external urls保留外部网址的查询字符串
【发布时间】:2022-01-21 02:24:53
【问题描述】:

可以使用查询字符串通过一些推荐 ID 将用户发送到主网站:

www.site.com/?ref=XXX

当他们点击登录区域的链接时,此查询字符串必须与该外部链接一起使用:

https://internal.site.com?ref=XXX

我正在使用 wordpress,因此我无法将 ?ref=<?php echo $_GET['ref']?> 附加到该链接。

我已经把.htaccess改成了:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php - [L,QSA]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L,QSA]
</IfModule>

返回主网站的每个链接都保留查询字符串,但外部 URL 不保留。

www.site.com?ref=XXX [original]
www.site.com/go/reds?ref=XXX [query strings are kept]
https://internal.site.com [query strings are removed]

htaccess 中的 QSA 标志应该可以解决问题,但它不适用于外部链接。

【问题讨论】:

  • 您上面引用的这些 RewriteRule 根本不适用于任何类型的外部 url。因此,很高兴看到那些 RewriteRule,您在其中尝试使用外部 url。我们需要一些上下文来理解问题的根源。
  • @Eugeny 希望现在清楚了!
  • 那么在每个外部链接上,您都想要您的推荐链接吗?
  • 我编辑了您的帖子以便更好地理解,只是等待编辑完成。如果我理解正确,您根本不能将查询字符串附加到链接在您的代码中,但是每当用户单击链接时——无论是内部链接还是外部链接——都应该保留原始查询字符串/ 附加?
  • 如果外部链接是用 php 构建的,你应该将查询字符串参数放在 php 中,这与 apache 无关。但要小心,&lt;?php echo $_GET['ref'] 是一个巨大的安全错误,如果这个参数包含 html 或 javascript 代码怎么办?

标签: php wordpress apache mod-rewrite


【解决方案1】:

您可以通过在页面末尾添加此脚本来执行此操作。此代码会将变量传递给客户端的每个链接。

<p><a href="/about/">Internal</a></p>
<p><a href="https://google.com">External</a></p>
<p><a href="/post/?id=1">Link with query string</a></p>

<script>
    var index = window.location.href.indexOf('?')
    if(index != -1){
        var querystring = window.location.href.slice(index + 1)
        var tagA = document.getElementsByTagName('a');

        for(var i = 0; i < tagA.length; i++){
            var href = tagA[i].getAttribute('href');

            href += (href.indexOf('?') != -1)? '&' : '?';
            href += querystring;

            tagA[i].setAttribute('href', href);
        }
    }
</script>

【讨论】:

  • 此代码错误。 href 变量是一个数字,因此不能在其上使用 indexOf。
【解决方案2】:

要在每次调用 the_permalink() 函数时应用自定义查询,您可以使用此过滤器

function append_query_string($url) {
    if (isset($_GET['ref'])) {
        $url = add_query_arg('ref', $_GET['ref']);
    }
    return $url;
}
add_filter('the_permalink', 'append_query_string');

但这可能是不方便的选项,因为它仅适用于使用 the_permalink 函数生成的链接,因此您必须将此函数也应用于菜单、发布类型存档链接,以及通常在没有生成链接的情况下wp 永久链接功能。

另一种解决方案是将引用存储在会话 cookie 或 $_SESSION 全局变量中:在这种情况下,每次用户浏览器关闭时引用都会丢失,因此如果用户手动返回您的站点,您也可以跟踪引用被转介后。

希望对你有帮助:)

【讨论】:

    【解决方案3】:
    $queryString = "";
    $x = 0;
    foreach($_GET as $key=>$value){
        $queryString[$x]= "&$key=$value;
        $x++;
    }
    $url = $url."?".implode("&",$queryString);
    

    【讨论】:

    • 虽然此代码可能会回答问题,但提供有关此代码为何和/或如何回答问题的额外上下文可提高其长期价值。
    【解决方案4】:

    这是一个简单可行的js函数来完成这个:

    function addQueryParamsToLinks() {
      const links = document.getElementsByTagName("a");
      const queryParams = window.location.search;
      for (const link of links) {
        link.setAttribute("href", `${link.getAttribute("href")}${queryParams}`);
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2015-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-11
      • 2014-11-12
      • 1970-01-01
      • 2012-10-04
      • 2015-03-30
      相关资源
      最近更新 更多