散列片段与服务器端代码冲突

时间:2012-09-26 21:48:18

标签: php javascript fragment-identifier

我有一个网站,用户可以选择一系列字母和数字,然后根据该网站将它们带到一个新页面。

因此可能会将他们带到/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。< / p>

由于PHP是服务器端,它在Javascript处理片段之前执行,我宁愿不让用户通过PHP脚本重定向,然后通过javascript返回。

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

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

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