HREF=""自动添加到当前页面的URL中(PHP)。无法理解。

39

我长期阅读stackoverflow,但这是我的第一个问题。

我正在使用Wordpress(具体来说是thesis主题)的custom_functions.php文件,并发现出于某些原因代码自动添加了当前页面的URL。例如,下面的代码是用来查询数据库并循环输出每个产品在自己的div中:

$result = db_connection($query);
while ($row = mysql_fetch_array($result)) { ?>
    <div class="box"><a href="">
        <img src="http://www.electricbikehub.co.nz<?php echo $row['product_root_directory']         . $row['mid_size_image'] ?>">
        <h2><?php echo $row['name']?></h2>
        <p><?php echo $row['description_brief'];?></p>
        <p><span class="multiple_product_red"><span class="multiple_product_linethrough">RRP: <?php echo $row['list_price']; ?>.</span> Our discounted price: <?php echo $row['our_price']; ?>. Includes delivery and GST.</span></p>
        </a>
    </div>
<?php } ?>

正如您所看到的第三行中说到 href=“”,但实际生成的链接是当前页面(在这种情况下是 'http://www.electricbikehub.co.nz/?page_id=1192')。如果我添加任何 href,例如 href =“something”,它将只将其添加到末尾,即 http://www.electricbikehub.co.nz/?page_id=1192something

非常感谢您提供帮助!


1
如果您在href中以http开头放置完整的URL,例如http://something.com,它是否会执行相同的操作? - davidethell
那听起来不太对。有图为证才有说服力。 - Ignacio Vazquez-Abrams
我不太能理解你的问题...... 你想在 href 属性中放什么? - Grexis
9个回答

53
这是浏览器如何解释空的 href。它会默认你想要链接回当前页面。这与不为 <form> 元素分配动作时的情况相同。
如果您在 href 中添加任何单词,它将将其附加到当前页面,除非您:
  • 在其前面添加斜杠 /,告诉它将其附加到您的基本 URL 上,例如 http://www.whatever.com/something
  • 添加 # 符号,此时它是一个内部锚点
  • 或者写上一个有效的URL
编辑:建议我添加一个链接以更清楚地说明情况。我找到了以下站点,认为它很好地解释了锚标签的 href 属性以及它如何解释 URL 路径。它不是特别技术性的内容,非常易懂,使用了许多示例来说明路径类型之间的区别:http://www.mediacollege.com/internet/html/hyperlinks.html

1
不确定提问者是否意识到这一点。看起来Hobbs不知道为什么一个空的href会有任何作用,或者为什么一个非相对或绝对的“something”会做它正在做的事情。我认为Wescrow的回答有助于澄清。也许不是完全的解释,但仍然是其中一部分的好解释。 - Kai Qing
为了更好地回答楼主的问题,我们添加了更多的信息。 - Wes Crow
1
谢谢wescrow!我认为这解释了我做错了什么。让我困惑的是,如果我输入:<a href=”www.google.com”> 它会将其附加到我的根域,所以最终会变成:www.electricbikehub.co.nz/www.google.com 但如果我输入 <a href=”http://www.google.com”> 就没问题了… 我不敢相信我竟然不知道它是这样工作的。这正常吗? - Evan Hobbs
1
@bfrohs 我已经添加了一个链接,帮助更好地解释情况。然而,我觉得你建议的页面太过技术性和难以阅读。虽然,我建议在 OP 对该主题有牢固的掌握后再阅读它会是一个不错的选择。 - Wes Crow
将URL更改为localhost/http://www.google.com并添加/,将URL更改为http//www.google.com并添加//,那么怎样才能获取正确的URL? - Raza Ahmed
显示剩余5条评论

25

在url前加上http://

不正确

<a href="www.example.com">www.example.com</span></p>

正确

<a href="http://www.example.com">www.example.com</span></p>

为什么即使正确的URL是https://www.example.com而不是http://www.example.com,这个解决方案仍然有效? - Arya
1
一个更加不依赖特定模式的值是 //www.example.com。现在所有东西都应该使用TLS,但你永远不知道,在开发环境中没有设置证书时,它可能非常有用。 - Kamafeather

10

如果你想将它重定向到其他的网址,比如谷歌(google.com),那么你需要这样做:

愿为他人提供帮助——Rikin <a href="//google.com">愿为他人提供帮助——Rikin</a>

这将从 href 属性中删除自己站点的网址。


3
您只需要在href中的$yourUrl前面加上//即可:
<a href="//<?=$yourUrl?>"></a>

"//" 表示文件。它将把 URL 视为文件 URL。" - Rahul Jha

2

一个适用于在本地服务器或线上开发的解决方案是,在你的链接前面添加 "//"。这将有效地移除你当前所在网站的URL。

示例:

<a href="www.google.com">Google.com</a>

这将会输出http://localhost/mySite/currentPage/www.google.com

相反,您应该这样做:

<a href="//www.google.com">Google.com</a>

这将输出www.google.com

我收到了 about:blank#blocked - BenyaminRmb

1

你应该意识到这是默认行为,对吧?如果你添加 /something,结果会有所不同。

你可以做很多事情来防止默认行为。

href="#":

什么也不做,只是锚点 - 不是最好的解决方案,因为它可能会跳转到页面顶部。

<a href="#">

href="javascript:void(0);"

什么都不做,完全合法。

<a href="javascript:void(0);"></a>

href="你实际想要的链接" (最佳)

显然是最好的。

<a href="<your-actual-intended-link>"></a>

如果您不想让标签跳转到任何地方,为什么要使用标签呢?

这个解决方案 href="javascript:void(0);" 对我很有帮助。谢谢! - nrod
如果你正在使用MVC范例,使用' href="#" '将会把你踢出到站点根目录。 - McAuley

0
我也遇到了同样的问题,就像之前的其他答案一样,但是当我尝试使用它时,它仍然会不断地向URL添加更多内容。所以我在我的代码中添加了一些东西。
从这个开始:
<a href="//<?= $_SERVER['HTTP_HOST'] ?>something/about">about</a>

至:

<a href="///<?= $_SERVER['HTTP_HOST'] ?>something/about">about</a>

如果你注意到我在 href="///" 上添加了一个反斜杠“/”,而不仅仅使用两个反斜杠


-2
无论如何,您的代码都会生成无效的标记:您不应该将块内容包装在链接中。 标签不是这样工作的。 如果您想要此效果,您应该使用js或在内容上方创建一个绝对定位的链接(z-index)。 更多信息请参见:将div变成链接
在呈现代码时,您应该确保验证您的代码:http://validator.w3.org

实际上,不是这样的。请参阅HTML规范。“a元素可以包裹整个段落、列表、表格等甚至整个部分,只要其中没有交互内容(例如按钮或其他链接)。” - 0b10011
有趣的是,这似乎取决于文档类型。根据w3.org,这仅允许在HTML5中使用。HTML4和XHTML文档类型将导致错误:“您已尝试将块级元素(例如“<p>”或“<table>”)放入内联元素(例如“<a>”,“<span>”或“<font>”)。 "我很高兴他们正在改变这一点(这对我来说从来没有意义),但至少在WP随附的文档类型(XHTML 1.0 Transitional)中,这仍然无效。谢谢你提醒我,这很重要。 - Ben D
从技术上讲,是的,但浏览器使用相同的解析器来解析XHTML 1.0 Transitional和HTML5,除非您特别设置服务器以返回正确的标头。此外,虽然WordPress的默认主题是XHTML 1.0 Transitional,但其他主题可能不是(在主题中使用XHTML5进行简单更改),并且将来可能会发生变化。如果您在评论中添加我们谈论过的概述,我很乐意+1 :) - 0b10011

-4
使用这个:
<a href="<?php echo(($_SERVER['HTTPS'] ? 'https://' : 'http://').$_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"]); ?>">Whatever</a>

它将使用当前的URL创建一个HREF...


1
我会非常小心地使用它,除非你使用.htaccess或PHP(代码注入)强制路径重写。此外,你应该在开头包含($_SERVER['HTTPS'] ? 'https://' : 'http://').,因为$_SERVER['SERVER_NAME']只返回www.somedomain.com(请参阅$_SERVER文档)。 - 0b10011
确实如此,但如果他有一个HTTP网站,他只需要在PHP代码之前包含HTTP://或HTTPS://...协议不会经常更改! - Frederick Marcoux
不是,但当它发生时,如果您包含了那段代码,他就不必手动查找每个并更改它(并且每个链接的重定向可能会增加页面加载时间)。无论如何,在您的答案中至少提到需要 http(s?)://,以及需要注意转义 $_SERVER['REQUEST_URI'] - 0b10011

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接