如何在 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?的主要内容,如果未能解决你的问题,请参考以下文章

用PHP实现简单的用户代理(移动和智能手机)检测和重定向

用PHP实现简单的用户代理(移动和智能手机)检测和重定向

需要 PHP 用户登录、数据库身份验证和重定向帮助

如何使用 php 发送欢迎电子邮件和重定向页面

浏览器检测和重定向[重复]

检测国家和重定向