【问题标题】:Keep a GET variable in URL在 URL 中保留一个 GET 变量
【发布时间】:2013-01-04 10:05:34
【问题描述】:

我有一个奇怪的问题,我相信你们中的大多数人都意识到这些问题是由开发人员无法控制的某些情况引起的!

我想弄清楚如何始终在 URL 中保留查询字符串参数。如果未设置参数,我希望将默认值附加到 URL ?param=something

我之前问过一个与此相关的问题,并且已经能够使用 htaccess 添加默认查询 - 但这仅适用于初始请求,而我需要确保它始终存在于地址中。

我正在考虑使用 cookie - 使用 PHP 设置,然后使用 .htaccess 进行查询。

所以,我想问这是否可能,是否有更好的方法来做到这一点?

【问题讨论】:

  • 我真的要问.. 为什么?
  • 如果您在提供值时使用默认值,这还不够吗?
  • 您当然可以使用 cookie,但我认为其他解决方案没有任何优势。但请注意,cookie 值不会填充到 $_GET 超全局变量中。
  • @webnoob 用于在网站上设置用户类型,而无需使用新路径修改所有现有 URL。必须设置该变量,以便我们的销售团队可以复制 URL 并将客户定向到特定页面并设置他们的用户类型。这是一个混乱的解决方案,但我没有想法!
  • @arkascha 如果我不能将 cookie 值传递到我的 RewriteRule 中,那么这个想法就结束了。

标签: php .htaccess session cookies session-cookies


【解决方案1】:

如果不更改所有 URL,我看不到这是可能的,正如所讨论的那样,这是一种非常老套的方法。

我建议你给他们一个“特殊”按钮,他们可以用它来复制链接。让他们使用此按钮来复制链接而不是 URL。然后,您可以在不入侵网站的情况下正确控制数据。

编辑:您“可以”添加一些 JQuery 以将所有链接附加到您的参数中。你有没有想过这个?

$(document).ready(function() {
  $('a[href]').each(function() {
    this.href = this.href + '?something=<?php echo $_SESSION["myparam"]; ?>'
  });
});

您可以从初始页面加载/会话中获取参数,但这需要您的用户启用 JS(现在大多数人都这样做)。

p.s 未经测试的半伪代码。如果你决定走这条路,我可以正确地测试它。

【讨论】:

  • 我创建了一个附加正确查询字符串的页面链接按钮,但是 jQuery 的想法很好,因为我将它包含在网站上。谢谢
【解决方案2】:

$_GET$_POST 超全局变量不应该像这样使用。而且我不知道为什么需要它,但无论如何您都可以使用SessionCookies 获得所需的功能。您尝试做的事情是不切实际的。行业标准是使用会话和 cookie。试试看,我相信它肯定会帮助你。如果您有任何问题,请告诉我。

【讨论】:

  • 会话已经运行并设置了用户类型 - 但仅在设置了 ?param=something 时。如果该人转到不同的页面,他们的会话仍处于活动状态,但查询字符串已消失。如果他们复制地址并将其发送给客户端,则客户端不会获得正确的内容。这样就可以解释了吗?
  • @AlexHolsgrove - 我现在看到你的问题了。你能不能给他们一个“特殊”按钮,让他们用来复制链接。让他们使用此按钮来复制链接而不是 URL。然后,您可以在不入侵网站的情况下正确控制数据。
  • 那是我最初的解决方案,但被更高的权力拒绝了......看来这是现在唯一可行的解​​决方案:)
  • @AlexHolsgrove 如果您决定使用它,我会将其移至答案。
【解决方案3】:

如果您使用的是 Apache 2,那么您可以添加一个重写规则,该规则将 GET 参数附加到其 URL 中没有“param=...”的每个请求。类似(未经测试):

RewriteCond %{QUERY_STRING} !(\A|&)param=
RewriteRule (.*) $1?param=defaultvalue [QSA]

详情请参阅modrewrite 's doc。如果您想将其限制为某个 URL,您可以在 %{REQUEST_URI} 上添加另一个 RewriteCond

【讨论】:

  • 感谢您的回答。我设法让你的建议工作(见我以前的问题:stackoverflow.com/questions/14339035/…)但是它并没有完全解决我的问题。我已经实现了一个按钮来复制 URL 并附加查询字符串 - 这是一个快速而干净的解决方案
【解决方案4】:

我大约 3 个月前才学习 php,所以我希望我不会带你走上一条路,这是我会尝试的。


编辑:自从我学习 php 到现在已经大约 5 个月了。我在此编辑之前的上一个版本仅“构建”了要附加的 get(它可能不起作用)。

if (!isset($_GET['param'])) {$_GET['param'] = 'something';} 

$var = '';
while ($other_gets = $_GET)
{
    foreach ($other_gets as $key=>$value)
    {
    if ($key = 'something') {}//do nothing we want the other gets
    else {$var .= '&'.$key.'='.$value;}
    }
}
$get = '?'.$user_param.$other_gets;

preg_replace 你的扩展

$string = 'your webpage before output';
$patterns = array();
$patterns[0] = '/.html/';
$patterns[1] = '/.php/';
$patterns[2] = '/yoursite.com /';//with space
$replacements = array();
$replacements[0] = '.html'.$get;
$replacements[1] = '.php'.$get;
$replacements[2] = 'yoursite.com/index.php'.$get;

然后打印你的字符串

echo preg_replace($patterns, $replacements, $string);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-05
    • 2020-08-05
    • 1970-01-01
    • 1970-01-01
    • 2012-04-14
    相关资源
    最近更新 更多