【问题标题】:How to properly create relative links如何正确创建相对链接
【发布时间】:2018-03-03 17:09:20
【问题描述】:

在我的源代码中,这是一个按钮链接,如下所示:

那么网页的代码是这样的:

但是当点击按钮时,网址是: http://localhost/personal/applications/mywebtest/install/?step=2

为什么要加“/personal/applications”?

【问题讨论】:

  • localhost/personal/application 是您的网络基本路径。首先检查您的$_SERVER['PHP_SELF'] 并打印此
  • 您的网站有<base href=""> 元素吗?
  • $_SERVER['PHP_SELF'] 值为 /mywebtest/install/index.php 并且没有 标签

标签: php


【解决方案1】:

编辑:让我开始...

href 属性的工作原理

假设您在一个页面http://example.com/foo/bar.html 上,并且那里有一个超链接,它可以是三个之一:

  • path/newpage.html - 这是一个相对路径(前面没有斜线),这意味着它将带你到 http://example.com/foo/path/newpage.html
  • /path/newpage.html - 这是一个绝对路径(以斜杠开头),它将带您到 http://example.com/path/newpage.html
  • example.com/otherpage.html - 这仍然是一个相对路径(如第一个示例),它将带您到 http://example.com/example.com/otherpage.html * 这是因为浏览器不知道你是指域example.com还是带有点的目录example.com,所以将其视为目录是一种标准。
  • http://example.com/path/newpage.html - 这是一个绝对 URL(它以协议开头) - 浏览器这里不需要做任何猜测,可以直接带你到 http://example.com/path/newpage.html

(这是假设base未设置,请阅读其余答案或查看https://www.w3schools.com/tags/tag_base.asp

现在是原始答案

当您在<a> 元素中使用relative 链接(没有域名的链接)时,您的浏览器需要一个完整的URL(带有域名)来满足您单击链接时的此类请求。因此它采用当前协议 (http) 和域 localhost 并将其与 $_SERVER['PHP_SELF'] 粘合,即

当前执行脚本的文件名,相对于 文档根目录。例如,在脚本中的 $_SERVER['PHP_SELF'] 地址http://example.com/foo/bar.php 将是/foo/bar.php。 (https://secure.php.net/manual/en/reserved.variables.server.php)

因此,您可以按照此处https://stackoverflow.com/a/46359685/299774 的建议为 href 创建完整网址

href=<?php echo $_SERVER['HTTP_HOST']."/mywebtest/install"; ?>?step=2';"

但是,如果您想将此类 HTML 保存在数据库中(例如,它是您博客中的一篇文章),这可能会导致问题 - 然后将您的应用程序移动到不同的域将需要更改数据库中的内容并将其填充新域。

所以我会坚持href 中的相对值,您可以通过在 HTML 中设置 base 元标记来实现:https://stackoverflow.com/a/6848509/299774

或者通过使用mod_rewrite 或类似的工具来四台服务器,但是我已经很久没有这样做了+超出了这个问题的范围,但是你可以检查流行的框架(CakePHP、Laravel)他们是如何做到的。

(他们必须这样做,因为必须能够在域之间移动应用程序:本地测试、登台、生产)

【讨论】:

【解决方案2】:

您可以使用 $_SERVER['HTTP_HOST']

         <input type="button" name="step" value="Continue to step 2 of 3"
onClick="location.href = '<?php echo (isset($_SERVER['HTTPS'])?"https" : "http")."://". $_SERVER['HTTP_HOST']."/mywebtest/install/"; ?>?step=2';"/>

【讨论】:

  • 当我像这样修改它时: $_SERVER['HTTP_HOST']."/mywebtest/install" ,网址更改为localhost/mywebtest/install/localhost/mywebtest/install?step=2
  • 你的意思是我必须使用绝对路径?我如何使用相对路径?更改一些 apache 配置文件?
  • 不,您不需要更改 Apache 配置文件。您只需指定目标 URL 地址。**/mywebtest/install/**。
【解决方案3】:

这是因为PHP_SELF 将磁盘上的路径返回到当前文件。 PHP 本身不知道页面的服务位置/方式。您将不得不为您的链接找到另一个变量/策略。另外,如果你真的想链接到同一个页面,你可以使用?step=2

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-29
    • 1970-01-01
    • 2014-07-08
    • 2018-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多