我正在使用window.history.pushState
为文章设置友情链接。例如,有不同类别的文章和链接就像这样myweb.com/category/java/variables
。
pushState
的问题在于您无法为其添加书签,导航到pushState
生成的网址时会找不到404,如上所示。
我在没有任何框架的情况下使用java作为服务器端,如果可能的话,我很想使用任何内容,在javascript中执行大多数操作并使用jQuery大量使用AJAX。
为了解决这个问题,我使用http://tuckey.org/urlrewrite/ url-rewrite库设置如下:
<urlrewrite>
<rule>
<from>^/intro</from>
<to type="redirect">http://localhost:8084/myweb.com/w?uri=intro</to>
</rule>
<rule>
<from>^/category/(.*)/(.*)</from>
<to type="redirect">http://localhost:8084/myweb.com/w?uri=category:$1:$2</to>
</rule>
</urlrewrite>
servlet w
做了一件非常简单的事情,它只是重定向到索引:
request.getRequestDispatcher("/index.jsp").forward(request, response);
因此,当用户导航到myweb.com/category/java/variables
时,该网址将被重写为http://localhost:8084/myweb.com/w?uri=category:java:variables
,此时此时我们在index.jsp上,而不是在我们收藏的网页上。
要解决此问题,我在页面加载时运行脚本:
href = window.location.href;
href = href.replace(/:/g,'/');
if(contains(href, "w?uri=")){
pageRequest = href.split("=")[1];
urlMap(pageRequest);
}
这会获得感兴趣的页面并将其转发到urlMap,后者处理所有网址(我简化了下一个方法,但它更通用):
function urlMap(href){
if(href==="category/java/variables"){
//here we do an ajax request to the server to get the content of the article.
//and also update the navbar url
window.history.pushState(state, title, "category/java/variables");
这可以正常工作,但浏览器导航栏中有轻微的闪烁,在按下输入网址后category/java/variables
转动w?uri=category:java:variables
100毫秒,然后转回category/java/variables
.. 。有更好的方法吗?
还有一些其他问题可以让这更容易:
category/java/variables
,或者如何以更好的方式传递它?是否可以在没有重定向循环的情况下制定规则?像这样:
<rule>
<from>^/intro</from>
<to type="redirect">http://localhost:8084/myweb.com/intro</to>
</rule>
或
<rule>
<from>^/category/(.*)/(.*)</from>
<to type="redirect">http://localhost:8084/myweb.com/category/$1/$2</to>
</rule>
答案 0 :(得分:0)
我可以按照自己的意愿成功映射网址,没有闪烁和奇怪的网址更改,所以为此我做了下一步:
1-将规则更改为:
<rule>
<from>^/intro</from>
<to>w?page=intro</to>
</rule>
<rule>
<from>^/([a-z]+)/([a-z]+)$</from>
<to>/w?category=$1&article=$2</to>
</rule>
删除type="redirect"
,因为这会更改导航栏网址。就像现在一样,它将<to>
url作为ghost请求传递。
2-在servlet中设置一个像category=java
这样的cookie和另一个像post=variables
这样的cookie。假设from
与myweb.com/java/variables
类似。然后转发索引。
3-网站加载的第一件事是告诉javaScript检查cookie并获取像/java/variables
这样的url引用,然后pushState新的url,即使是没有必要也很难。