保留外部URL的查询字符串

时间:2015-11-17 02:18:18

标签: php wordpress apache mod-rewrite

可以使用查询字符串通过某个引荐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>

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

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]

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

3 个答案:

答案 0 :(得分: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>

答案 1 :(得分:1)

要在每次调用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永久链接功能。

另一个解决方案可能是将ref存储在会话cookie或$ _SESSION全局中:在这种情况下,每次用户浏览器被隐藏时,引用都将丢失,因此如果用户手动返回到您的站点,您也可以跟踪引用被推荐之后。

希望有所帮助:)

答案 2 :(得分:0)

$queryString = "";
$x = 0;
foreach($_GET as $key=>$value){
    $queryString[$x]= "&$key=$value;
    $x++;
}
$url = $url."?".implode("&",$queryString);