2013-02-03 46 views
2

当您点击时,是否有一种方法可以在整个站点中保留url参数?我正在制作一个演示网站,在第一页上设置一个url参数,以确定以下页面显示的内容。我会使用会话变量,但内部用户可能会在彼此之间共享链接,然后会话将不存在。我尝试了谷歌搜索,但所有返回的文章都与Cake框架相关。有没有办法实现这一点,而不使用框架?流动的持久性URL参数

例子:

  • 选择页面>用户选择使用案例和印刷机提交查看演示网站
  • 内页>检测基于用例的URL参数,并显示数据。
  • 当用户点击演示站点时,参数会一直显示相关数据。
  • 当用户返回选择页面时,他们可以选择一个新的用例并重复上述操作。
+1

没有魔法。您需要手动将其附加到您的代码生成的所有链接的查询字符串中。 – meagar

+0

使用会话值,但不显式添加url参数。这不是一个好习惯,并且不是一个好的用户体验(保持干净的URL)。会话值是登录的。 – Amelia

回答

1

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

一些备选思路:

IDEA 1:

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

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

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

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

这段代码并没有改变所有的内部链接,它只做了以下几点:当一个内部链接被访问并且URL参数被省略(如通常那样),这段代码将停止页面不显示参数并重定向到与param相同的页面。

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

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

这样,当URL是由2个用户共享,这将始终包含psel URL PARAM当新用户第一次访问它,它会相应地设置他的会话变量。

IDEA 2:

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

这个想法我觉得好一点,因为它实现了同样的事情,没有重定向。使用符号链接解释最简单,但请记住,这也可以使用.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之间将保持不变,因为它们通常是相对的。

+0

htaccess重写有点凌驾于我的头上,但试图理解选项1.你能详细阐述一下吗?我只想澄清一点 - 如果用户访问了一个页面并且它有一个url_param,那么我需要以某种方式将该参数附加到页面上的所有网址,而无需调整其代码。 (这些网页上有大量的链接) – Syon

+0

我在这两种解决方案上都阐述了一点。这两种解决方案都避免了更改大量内部URL的要求。我其实更喜欢第二个。 – talkol

+0

谢谢!听起来像一个坚实的想法 - 我要去与Idea2。 – Syon

0

我觉得你最好的解决办法是将存储他们的初始选择一个$_SESSION变量里面,然后简单地认为变量追加到整个网站的结构的URL,例如:

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

不幸的是,在这个演示网站上有大量的网址。我需要一些可以自动附加该参数的东西。我现在想也许只是通过js做到这一点?抓住所有锚点追加参数.. – Syon

+0

如果可能,我会避免JS。永远不要依赖客户端脚本,因为它可以被用户禁用,然后您的网站的功能不能得到保证。 – BenM

1

你描述什么是cookies,但它们不会出现在URL。

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

你必须使用输出缓冲URL重写(见output_add_rewrite_var),解析来自applicatin生产的产出和更换链接第二个选项。但这是一个有点愚蠢的做法。当您有大量应用程序并且不想修改它时,这将是合理的。

所有其他方面都有关使用特殊功能或在框架生成PHP链接。