持久性URL参数

时间:2013-02-03 17:49:24

标签: php

当您点击时,有没有办法在整个网站上保留网址参数?我正在开发一个演示站点,该站点在第一页上设置url参数以确定在以下页面上显示的内容。我会使用会话变量,但内部用户可能会彼此共享链接,然后会话就不存在了。我已经尝试了谷歌搜索,但所有返回的是与PHP框架相关的文章,如蛋糕。有没有办法在不使用框架的情况下实现这一目标?

流程示例:

  • 选择页面>用户选择用例并按提交查看演示站点
  • 内页>检测URL参数并根据用例显示数据。
  • 当用户点击演示网站时,参数会一直显示,因此会显示相关数据。
  • 当用户返回选择页面时,他们可以选择新的用例并重复上述操作。

4 个答案:

答案 0 :(得分:1)

您只需在选择中添加url参数,并确保始终在所有内部链接中找到它。我假设你不想这样做,因为它的变化太多了。

其他一些想法:

IDEA 1:

将初始选择保存在会话内或cookie中。还为所有页面添加可选的url参数,该参数也包含所选内容。要避免更改所有内部链接,请检查服务器端是否给出了选择url参数。如果不是,则立即重定向到相同的URL,只需添加url参数(根据会话/ cookie)。这样,url参数将始终显示,而不会更改所有内部链接,用户仍可以共享链接。

为了实现起见,我们假设我们的会话变量是$_SESSION['sel'],我们的可选URL参数是psel。我们假设网站中的所有页面都是通过php提供的。以下几行php应该出现在所有页面的顶部(可以放在一个单独的php文件中并包含在每个页面中):

if (!isset($_REQUEST['psel']))
{
  header('Location: '.$_SERVER['REQUEST_URI'].'&psel='.$_SESSION['sel']);
  exit;
}

这是伪代码,我在我的iPad上,请原谅我,如果它有点短而且不完美。这一行的作用是检查是否定义了URL参数,如果没有,则重定向(到同一页面)并根据我们的会话变量定义它。这种方式即使我们有一个不包含URL参数的内部链接,这个重定向也会添加它。请求uri中有一个关于?的小错误,我会让你解决它。

此代码不会更改所有内部链接,它只会执行以下操作:当访问内部链接并省略URL参数时(通常会这样),此代码将阻止页面显示而不显示param并使用param重定向到同一页面。

另一个重要的代码是在定义URL参数的情况下更改会话变量。这可以通过将以下块添加到上面的代码来完成:

else $_SESSION['sel'] = $_REQUEST['psel'];

这样,当两个用户共享该网址时,它将始终包含psel网址参数,当新用户首次访问该网址时,它会相应地设置其会话变量。

IDEA 2:

为每个选择创建一个“假”目录。例如,假设您的网站为http://example.com/index.php,那么您将拥有http://example.com/sel1/index.phphttp://example.com/sel2/index.php。这些目录不是真实的,并且使用.htaccess重写(甚至FS中的符号链接)实际上将指向原始文件。除此之外,现在你在路径中有这个魔术参数。这很有用,因为所有相对链接的路径将保持不变,这意味着您不必更改所有内部链接。如果您需要访问当前选择,可以通过解析当前URL的路径轻松获取它。

我认为这个想法有点好,因为它在没有重定向的情况下实现了同样的目标。用符号链接解释是最简单的,但请记住,这也可以通过.htaccess重写规则来完成。 Linux中的符号链接是链接到另一个路径的路径。如果我运行以下控制台命令(通常在我的服务器上使用SSH):

ln -s . sel1
ln -s . sel2

它将在里面创建2个目录。 (本地目录),名为sel1和sel2,但它们只是指向原始当前目录的链接。如果此当前目录是我的Web服务器文档根目录,则效果是访问:

http://example.com/sel1/index.php

实际上会访问:

http://example.com/index.php

请注意,这不是目录的副本。如果我对index.php或本地目录中的任何其他文件进行了更改,这些更改也会反映在/sel1/sel2

这有什么用?如果我想显示选择2,我将使用网址http://example.com/sel2/index.php,而不是访问我的常规网站。由于符号链接,此网址的行为与原始网站http://example.com/index.php完全相同。

现在让我们假设我想检查php是否显示选择2,我可以简单地检查变量$_SERVER['REQUEST_URI']并查看它是否包含路径/sel2

此路径在所有内部URL之间保持不变,因为它们通常是相对的。

答案 1 :(得分:1)

您所描述的是Cookie,但它们不会出现在网址中。

对于您的用例,最佳解决方案是URL和相关链接中的路径前缀,正如talkol在他的第二个想法中所描述的那样。只要你保持相对链接,它就不需要在服务器端进行任何额外的工作。

您拥有的第二个选项是使用输出缓冲URL重写器(请参阅output_add_rewrite_var),解析应用程序生成的输出并替换链接。但这有点愚蠢。如果您有大型应用程序并且不想修改它,那将是合理的。

所有其他方法都是使用您的特殊功能或在框架中使用PHP生成链接。

答案 2 :(得分:0)

我认为您最好的解决方案是将其初始选择存储在$_SESSION变量中,然后只需将该变量附加到整个网站结构中的网址,例如:

$url = (isset($_SESSION['use_case'])) ? $_SESSION['use_case'] : 'default';
echo 'my-page.php?use_case='.urlencode($url);

答案 3 :(得分:0)

如果只是基于案例的问题,您可以在$ _SESSION上设置案例,并为每种情况简单地使用一个开关。

http://www.php.net/manual/en/book.session.php

http://www.php.net/manual/en/control-structures.switch.php