当您点击时,有没有办法在整个网站上保留网址参数?我正在开发一个演示站点,该站点在第一页上设置url参数以确定在以下页面上显示的内容。我会使用会话变量,但内部用户可能会彼此共享链接,然后会话就不存在了。我已经尝试了谷歌搜索,但所有返回的是与PHP框架相关的文章,如蛋糕。有没有办法在不使用框架的情况下实现这一目标?
流程示例:
答案 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.php和http://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上设置案例,并为每种情况简单地使用一个开关。