【问题标题】:HTML <a> link concatenating the 'href' content to existing URLHTML <a> 链接将“href”内容连接到现有 URL
【发布时间】:2021-12-14 17:03:44
【问题描述】:

到目前为止,我一直在使用 GET 参数在我的网站页面之间进行路由(托管在我大学的服务器上)。我想改用$_SERVER["PATH_INFO"],因为我猜它是一种更简洁的页面间路由方式。

我想从:

www.universitydomain.subdomain/myProject/index.php?action=imageGallery

收件人:

www.universitydomain.subdomain/myProject/index.php/imageGallery

我有 3 页:

  1. 我的主页,index.php
  2. 我的图片库页面,当前可访问 当GET参数action等于“imageGallery”时
  3. 将图像添加到我的画廊的页面,当 GET 参数 action 时可访问 等于“addImage”

在每个页面上都有一个由&lt;a&gt; 链接组成的菜单:

<a href="index.php" > Main page </a>
<a href="?action=imageGallery" > Gallery </a>
<a href="?action=addImage" > Add image </a>

这样做时,一切正常。所以我尝试使用PATH_INFO 样式的 URL,如下所示:

<a href="index.php" > Main page </a>
<a href="index.php/imageGallery" > Gallery </a>
<a href="index.php/addImage" > Add image </a>

如果我在图库页面上,我希望 &lt;a&gt;Main pagey&lt;/a&gt; 链接在我的 URL 中写入 index.php,这会将我带回主页。然而,这种情况发生了:

  • 我在index.php。 网址是 www.universitydomain.subdomain/myProject/index.php
  • 我点击第二个链接进入画廊。网址变成 www.universitydomain.subdomain/myProject/index.php/imageGallery
  • 我单击第一个链接返回主页。网址变成 www.universitydomain.subdomain/myProject/index.php/index.php
  • 在第三步,如果不是返回主页,我 点击第三个链接进入addImage页面,网址 变成 www.universitydomain.subdomain/myProject/index.php/index.php/addImage

这是为什么呢?我无法重现我的问题的最小示例,因此它似乎与我的项目相关(不幸的是,这有点太大,无法包含在这篇文章中)。即使无法重现此问题,你们中的一些人也可能会与之相关并提出一些建议。

我的印象是,在进入图库页面(其 URL 为 /myProject/index.php/imageGallery)后,我的页面的“参考路径”已从 /myProject/ 更改为 /myProject/index.php/,因此,当点击&lt;a href="index.php"&gt; 链接,它将我重定向到 /myProject/index.php/index.php 而不是 /myProject/index.php/

【问题讨论】:

  • “为什么会这样?” 这是将 href 属性中的相对 URL 解析为它所属的超文本文档的基本 URL。此分辨率是标准化的,以及如何获取文档基本 URL。图库页面上 index.php 的链接必须是 "../index.php" 而不是 "index.php" 否则浏览器会以这种方式运行。比较:greenbytes.de/tech/webdav/rfc3986.html#reference-resolution 了解所有选项。
  • 感谢参考链接,非常有用。

标签: php url-routing pathinfo


【解决方案1】:

当您将带有单个 index.php 端点(有时也称为 Front Controller)的 URL 布局从 query-info-part (?action=&lt;page-name&gt;) 迁移(更改)到路径部分(在 PHP 中通常使用 @ 987654324@) 并且您引入了额外的路径组件,您可以看到这种行为。这是 URL 解析规则的标准。

query-info               ->  path                      effect

index.php -or- ?, ., ""  ->  index.php                 0 new path components
?action=imageGallery     ->  index.php/imageGallery    + 1 new path component
?action=addImage         ->  index.php/addImage        + 1 new path component

在您非常具体的情况下以简化迁移,您可能需要考虑一种快速解决方法:如果没有给出PATH_INFO,则重定向到与其他两个具有相同数量路径组件的主页页面。

if (empty($_SERVER['PATH_INFO'])) {
   header('location: index.php/mainPage');
   echo '<!DOCTYPE html><title>moved</title><h1>moved</h1><a href="index.php/mainPage">here</a>.';
   return;
}
<a href="mainPage" > Main page </a>
<a href="imageGallery" > Gallery </a>
<a href="addImage" > Add image </a>

或类似的,将index.php/mainPage 替换为index.php/,这可能对您的情况有更好的语义:

<a href="./" > Main page </a>
<a href="./imageGallery" > Gallery </a>
<a href="./addImage" > Add image </a>

对于最后两个,./ 前缀严格来说是不必要的,这是等价的:

<a href="./" > Main page </a>
<a href="imageGallery" > Gallery </a>
<a href="addImage" > Add image </a>

这可能会让您更好地了解 URL 布局更改的后果,同时让您的网站正常运行。

对于基本的基本理解,我强烈建议您研究 URL 解析规范,因为这是非常基础的东西,将帮助您自行决定 URL 布局更改以及您希望如何处理 HTML 文档与您的服务器端脚本和整体应用程序一样。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-19
    • 2014-08-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多