2

我有一个网站,用户可以在其中选择一系列字母和数字,然后将它们带到基于此的新页面。

所以可能需要他们/cds/C_1_3_A_2

目录中没有实际C_1_3_A_2的页面cds,我有一个重写规则:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^cds/(.*) /cds/index.html [L]

因此,如果请求的文件不存在,它将被重写为index.html,其中 php 脚本获取 URL 的最后一个组件 ( C_1_3_A_2) 并加载相关内容,如果 URL 的最后一个组件是/cds则 PHP 脚本重定向到/cds/C_1_1_A_1

但是我想添加 AJAX 以使其更流畅,这意味着我需要添加对哈希片段的支持,因为旧版浏览器不支持 history.pushState。

所以如果用户自己去/cds/#C_1_3_A_2,应该和/cds/C_1_3_A_2

但是由于片段没有被发送到服务器,用户最终成为 /cds/C_1_1_A_1#C_1_3_A_2,并获得了与 相关的内容C_1_1_A_1,而不是C_1_3_A_2他们想要的。

由于 PHP 是服务器端,它在 Javascript 可以处理片段之前执行,我不希望用户被 ​​PHP 脚本重定向,然后由 javascript 返回。

那么如何添加对哈希片段的支持呢?其他网站如何处理这个问题?

4

2 回答 2

0

您需要将更多内容移至前端。通常,如果链接仅包含一个哈希片段,它们不会触发新请求(但可能会导致跳转到屏幕顶部之类的事情,如果需要可以处理)。听起来您的问题可能是添加“/”。如果您希望链接中包含“/”,则该页面应该已经具有“/”,并且链接应该仅包含哈希。

处理此问题的最佳方法是绑定到window.hashchange新浏览器支持的事件。将有适用于旧版浏览器的 polyfill。当 hashchange 事件被触发时,您可以检索新 URL 的哈希位置,然后使用它向后端执行 Ajax 请求。

理想情况下,可以修改后端,以便您可以添加?partial=true某种形式的参数,因此它只返回可以添加到页面的内容(没有任何形式的周围布局)。这应该是唯一需要的后端更改。否则,要开始使用,您可以使用 JavaScript 从检索到的数据中提取内容并将其集成到页面中(但这应该只是暂时的,因为完整的内容仍将被传输)。

于 2012-09-26T22:18:46.733 回答
0

如果您查看带有散列的页面请求的标头,散列部分甚至不会发送到 Web 服务器。因此,php 或 apache 都不会知道哈希是否存在。如果没有“最后一个组件”,您可能最好只加载索引页面而不重定向,然后通过 javascript 将默认值设置为哈希。

于 2012-09-26T22:15:41.827 回答