【问题标题】:How does url rewrite works?url 重写是如何工作的?
【发布时间】:2011-06-21 19:24:39
【问题描述】:

web服务器如何实现url重写机制,改变浏览器的地址栏?
我不是在询问具体信息来配置 apache、nginx、lighthttpd 或其他!
我想知道当服务器要重写url时,会向客户端发送什么样的信息?

【问题讨论】:

标签: http browser url-rewriting httpwebrequest


【解决方案1】:

有两种类型的行为。

一个是重写,一个是重定向。

重写

服务器自己执行替换,使http://example.org/my/beatuful/page这样的URL被理解为http://example.org/index.php?page=my-beautiful-page

使用重写,客户端看不到任何东西,重定向只是内部的。浏览器中的 URL 没有变化,只是服务器对它的理解不同。

重定向

服务器检测到该地址不是服务器想要的。 http://example.org/page1 已移至 http://example.org/page2,因此它会使用 HTTP 3xx 代码告诉浏览器新页面是什么。然后客户端请求此页面。因此浏览器中的地址发生了变化!

流程

该过程保持不变,并由该图很好地描述:

备注每次重写/重定向都会触发对重写规则的新调用(IIRC 除外)

RewriteCond %{REDIRECT_URL} !^$
RewriteRule .* - [L]

对于停止循环很有用。 (因为它已经发生过一次就不会重写)。

【讨论】:

  • 你能解释一下RewriteCond %{REDIRECT_URL} !^$ RewriteRule .* - [L]
  • Apache 在内部重定向发生时创建此重定向变量。所以你可以在处理新的重定向之前检查它是否为空。
  • 这里解释了重写标志link
【解决方案2】:

您是在谈论服务器端重写(如 Apache mod-rewrite)吗?对于那些,地址栏通常不会改变(除非执行重定向)。 或者你在谈论重定向?这些是通过让服务器响应 HTTP 代码(301、302 或 307)和 HTTP 标头中的位置来完成的。

【讨论】:

  • 我说的是服务器端规则。谢谢!
【解决方案3】:

“URL 重写”有两种形式:纯粹在服务器内完成的和重定向的。

如果纯粹是在服务器内部,这是内部事务,仅与服务器中实现的调度机制有关。例如,在 Apache HTTPD 中,mod_rewrite 可以做到这一点。

如果是重定向,则在响应中发送暗示重定向的状态代码,以及指示浏览器应重定向到哪个 URL 的 Location 标头(这应该是绝对 URL)。 mod_rewrite 也可以通过 [R] 标志执行此操作。 状态码通常为302 (found),但也可以配置为其他代码(例如301或307)。

另一个相当常见的用途(通常不被注意,因为它通常在 Apache HTTPD 中默认打开)是重定向到在目录上带有斜杠的 URL。这是由mod_dir实现的:

发出“尾部斜杠”重定向 当服务器收到请求时 网址http://servername/foo/dirname 其中 dirname 是一个目录。 目录需要尾部斜杠, 所以 mod_dir 发出重定向到 http://servername/foo/dirname/.

【讨论】:

    【解决方案4】:

    URL 重写可以纯粹在服务器端转换 URL。这使 Web 应用程序开发人员能够从多个 URL 访问 Web 资源。

    例如,用户可能会请求http://www.example.com/product/123,但由于重写,实际上提供了来自http://www.example.com/product?id=123 的资源。请注意,浏览器中显示的地址无需更改。

    如果需要,可以更改地址。为此,与上述类似的映射发生在服务器上,但不是将资源呈现回客户端,而是服务器将重定向(301 或 302 HTTP 代码)发送回客户端以获取重写的 URL。

    对于上面的示例,这可能如下所示:

    客户请求

    GET /product/123 HTTP/1.1
    Host: www.example.com
    

    服务器响应

    HTTP/1.1 302 Found
    Location: http://www.example.com/product?id=123
    

    此时,浏览器将对Location标头中的URL发出新的GET请求。

    【讨论】:

      【解决方案5】:

      Jeff Atwood 有一篇很棒的帖子:http://www.codinghorror.com/blog/2007/02/url-rewriting-to-prevent-duplicate-urls.html

      web服务器如何实现url重写机制,改变浏览器的地址栏?

      URL 重写和转发是两个完全不同的东西。 服务器无法控制您的浏览器,因此它无法更改您浏览器的 URL,但它可以要求您的浏览器转到其他 URL。当您的浏览器从服务器获得响应时,完全取决于您的浏览器来决定如何处理该响应:它可以跟随重定向,忽略它或者真的很卑鄙并向服务器发送垃圾邮件,直到服务器放弃。服务器没有用于更改地址的“机制”,它只是一种协议(HTTP 1.1),当特定资源被移动到不同的位置时,服务器会遵守协议(HTTP 1.1),因此是 3xx 响应。

      【讨论】:

      • -1 我在那篇文章中没有看到任何描述其工作原理的地方。
      • @Davy8,当我的老板把我叫到他的办公室时,我正在编辑我的问题并添加所有这些信息:)......现在为时已晚。
      猜你喜欢
      • 2012-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-16
      • 2019-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多