我有一个网站,用户可以选择一系列字母和数字,然后根据该网站将它们带到一个新页面。
因此可能会将他们带到/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返回。
那么如何添加对哈希片段的支持呢?其他网站如何处理这个?
答案 0 :(得分:0)
如果查看带有散列的页面请求的标头,则散列部分甚至不会发送到Web服务器。因此,无论是php还是apache都不知道哈希是否存在。你可能最好只加载索引页面,如果没有“最后一个组件”则不重定向,然后通过javascript将默认值设置为哈希值。
答案 1 :(得分:0)
您需要将更多内容移至前端。通常,如果链接仅包含散列片段,则它们不会触发新请求(但可能会导致跳到屏幕顶部,如果需要可以处理)。听起来好像你的问题可能是添加“/”。如果您想在链接中使用该页面,则该页面应该已经具有“/”,并且链接应该仅包含哈希。
处理此问题的最佳方法是绑定到较新浏览器支持的window.hashchange
事件。旧版浏览器可以使用polyfill。当触发hashchange事件时,您可以检索新URL的哈希位置,然后使用它来向后端发出Ajax请求。
理想情况下,可以修改后端,以便您可以以某种形式添加像?partial=true
这样的参数,这样它只返回可以添加到页面中的内容(没有任何形式的周围布局)。这应该是唯一需要的后端变更。否则,您可以使用JavaScript从检索到的数据中提取内容并将其集成到页面中(但这应该只是在处理事情时是暂时的,因为完整内容仍将被转移)。