如何在 PHP 中检测、删除和重定向带有 # 的 URL?
Posted
技术标签:
【中文标题】如何在 PHP 中检测、删除和重定向带有 # 的 URL?【英文标题】:How do I detect, remove, and redirect urls with a # at the end in PHP? 【发布时间】:2011-06-19 10:23:08 【问题描述】:客户要求我自动将任何带有井号的网址重定向到不带井号的版本,但我认为我没有使用这个公式在我的任何网址中检测到 #。我使用 curPageURL() 公式通过电子邮件向自己发送了一个示例 URL,它不包含我正在测试的 URL 中的尾随 # 符号。
function curPageURL()
$pageURL = 'http';
if ($_SERVER["HTTPS"] == "on") $pageURL .= "s";
$pageURL .= "://";
if ($_SERVER["SERVER_PORT"] != "80")
$pageURL .= $_SERVER["SERVER_NAME"].":".$_SERVER["SERVER_PORT"].$_SERVER["REQUEST_URI"];
else
$pageURL .= $_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"];
return $pageURL;
if(stripos($currenturl,'#'))
Header( "HTTP/1.1 301 Moved Permanently" );
$location = 'Location: ' . str_replace('#','',$currenturl) . '/';
Header($location);
*更正 - 我在标题的最后说,我的意思是最后,我的代码在这里明显地检测到 url 中任何地方的井号。 *
【问题讨论】:
#
不会传输到服务器(它保留在浏览器端),因此在 php 中是不可能的。你可以在 JS 中做到这一点,但不能在 PHP 中......
【参考方案1】:
#
之后的部分是“散列”或“片段”。它完全是客户端的——它永远不会发送到服务器(如果是,它会导致错误)。因此,您的 PHP 脚本将永远看不到它,因此无法修复它。这是正确的行为,并且是设计使然。
也就是说,您可以使用客户端解决方案检查#fragment(例如,在带有document.location.hash
的JS 中)并从那里重定向。
【讨论】:
谢谢,我会将此标记为正确答案,但我必须再等 8 分钟。 这是正确的,但它忽略了一个事实:如果服务器执行重定向,它将携带片段(或者更准确地说,浏览器会) - 可能导致不良行为。事实上,我正在尝试解决这个问题(到目前为止没有太大的成功)。 (reference)【参考方案2】:您可以使用 javascript 覆盖页面上所有标签的点击事件。如果您使用的是 jQuery,您可以执行以下操作。
$(function()
$('a').click(function(ev)
alert(ev.currentTarget.hash);
return false;
);
);
<table>
<tr><td><a href='http://google.com/#test1'>Test 1</a></td></tr>
<tr><td><a href='/game/?p=test#test2'>Test 2</a></td></tr>
<tr><td><a href='#test3'>Test 3</a></td></tr>
</table>
当点击链接时,点击事件被触发,此时您可以根据来自 href 的哈希值来决定要做什么。您可以使用哈希作为 GET 参数重建 href 并重定向页面,或者您可以将其转换为 ajax 调用。
在点击事件中,您可以决定如何处理井号标签。如果您真的在服务器端需要它,那么您可以随时将其附加到查询字符串中,或者您可以进行 ajax 调用。
【讨论】:
以上是关于如何在 PHP 中检测、删除和重定向带有 # 的 URL?的主要内容,如果未能解决你的问题,请参考以下文章