Php 如何在不重新加载页面的情况下更改地址栏上的url

Php 如何在不重新加载页面的情况下更改地址栏上的url,php,ajax,Php,Ajax,我有 和一个子菜单 主页=> 关于我们=> 产品=> 但是我想处理每个请求,只需使用Ajax请求更改内容。这样,网站只加载内容部分,而且速度更快,导航更容易 这里的问题是搜索引擎优化,因为谷歌将看到的唯一URL是,我想与关于我们的内容、产品内容等联系起来 我知道我可以用PHP来实现这一点,只需动态读取URL和编写Ajax,但这样做时,每次都会重新加载整个页面。 有没有一种方法可以在不重新加载整个页面的情况下执行此操作? 我想我需要的是在子菜单中有一个常规的锚点,例如指向“”的锚点,但是当单击

我有

和一个子菜单

  • 主页=>
  • 关于我们=>
  • 产品=>
但是我想处理每个请求,只需使用Ajax请求更改内容。这样,网站只加载内容部分,而且速度更快,导航更容易

这里的问题是搜索引擎优化,因为谷歌将看到的唯一URL是,我想与关于我们的内容、产品内容等联系起来

我知道我可以用PHP来实现这一点,只需动态读取URL和编写Ajax,但这样做时,每次都会重新加载整个页面。 有没有一种方法可以在不重新加载整个页面的情况下执行此操作? 我想我需要的是在子菜单中有一个常规的锚点,例如指向“”的锚点,但是当单击时,不是打开这个页面,而是处理Ajax请求

如果这是可能的,谷歌很可能会把它看作是一顶黑帽子,对吗

问候
Alex

在不更改页面的情况下,您无法更改地址栏中的URL,因为要做到这一点,我可以让您访问我,但将地址栏更改为“读取”

这是一个路由问题,而不是AJAX问题

如果您使用的是另一个工具(cough ASP.NET MVC cough),那么您只需添加一个接受URL的路由(我希望在PHP中有一种方法可以做到这一点),如

/home
/products
...
然后把他们送到,比如说

/index.php?area=home
/index.php?area=products
当在好的MVC或RESTful URL系统之外使用时,这通常通过重写引擎来完成。我在IIS上使用,但如果您在LAMP堆栈上工作,我认为Apache提供了一个提供相同功能的模块。(谷歌
.htaccess

警告:接下来是咆哮

而且,无论如何

  • 避免尝试用JavaScript编写整个应用程序。服务器在那里是有原因的。作为一名web开发人员,您的部分工作是将尽可能多的工作放到服务器上。当您尝试在客户端上执行所有操作时,浏览器性能和兼容性问题会让您发疯

  • 避免回发在很多情况下都是有意义的,但这并不是你应该尝试应用到每一页上的灵丹妙药。通常,单击链接时加载新页面是有意义的。这正是用户所期望的,它更稳定(因为所需的大多数基础设施都是服务器端的),并且检索相同内容的速度不比AJAX请求慢

  • 规则:

  • 永远不要弄坏后退按钮。如果没有仔细的规划,大多数AJAX应用程序都会打破这一规则
  • 见规则1

  • 这听起来像是应该用一个来完成的,但是假设您有充分的理由使用AJAX,您可以通过修改哈希后面的部分,或者更好的是,修改hashbang,用javascript来更改URL:

    window.location.hash = "#!about-us";
    

    要从SEO的角度了解更多关于hashbang的信息,请查看Shopify是如何做到的?转到他们的网站,单击“功能”链接,您将看到URL显示:

    然后单击任何子链接,您将看到URl中的地址在不使用哈希的情况下发生更改,但没有页面翻转


    我不认为他们正在使用ajax来更改内容,因为所有内容似乎都包含在页面上的隐藏div中,但无论如何,您显然可以使用客户端技巧更改URL。

    这里有一个解决方案:

    window.history.pushState(data, title, url)
    
    这里Rob解释了它的工作原理,您有一个工作示例:


    你知道Ajax不会自动让事情变得更快,对吧?????你感觉好吗?Ajax是最新的流行语?正在使用的PHP解决方案:
    echo“window.history.pushState(“”,,”http://desired.url.here');";。(来自下面的一个地下室)正是我想说的,但我找不到pdf:PYou可以,但这是一件很不明智的事情。如果答案是错误的,那怎么可能是正确的答案呢?下面有一个很好的答案,解释了如何去做那些你不能做的事情!谢谢大卫,但这不是我要问的。我使用htaccess重写,主要是为了SEO目的。无论如何,我同意第1点,我发现JS+Ajax非常有用,有时我用得太多了。但主要是CMS,访客端没有。