2

当您单击时,有没有办法在整个站点中保留 url 参数?我正在开发一个演示站点,该站点在第一页上设置 url 参数以确定以下页面上显示的内容。我会使用会话变量,但内部用户可能会在彼此之间共享链接,然后会话将不存在。我试过谷歌搜索,但所有返回的都是与 Cake 等 php 框架相关的文章。有没有办法在不使用框架的情况下实现这一点?

流程示例:

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

4 回答 4

1

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

一些替代的想法:

想法 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 参数(通常会)时,此代码将停止页面在没有参数的情况下显示并重定向到与参数相同的页面。

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

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

这样,当 URL 被 2 个用户共享时,它将始终包含pselURL 参数,并且当新用户第一次访问它时,它将相应地设置他的会话变量。

想法 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,我将使用 URL,而不是访问我的常规站点http://example.com/sel2/index.php。由于符号链接,此 URL 的行为将与我的原始网站完全相同http://example.com/index.php

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

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

于 2013-02-03T18:00:18.940 回答
1

您所描述的是 cookie,但它们不会出现在 URL 中。

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

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

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

于 2013-02-03T22:05:08.330 回答
0

我认为您最好的解决方案是将他们的初始选择存储在一个$_SESSION变量中,然后将该变量简单地附加到整个站点结构的 URL 中,例如:

$url = (isset($_SESSION['use_case'])) ? $_SESSION['use_case'] : 'default';
echo 'my-page.php?use_case='.urlencode($url);
于 2013-02-03T17:56:23.170 回答
0

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

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

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

于 2013-02-03T18:04:35.573 回答