url重写如何工作?

时间:2011-06-21 19:24:39

标签: http browser url-rewriting httpwebrequest

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

5 个答案:

答案 0 :(得分:29)

有两种行为。

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

重写

服务器执行自身替换,将http://example.org/my/beatuful/page之类的网址理解为http://example.org/index.php?page=my-beautiful-page

通过重写,客户端看不到任何内容,重定向仅在内部。浏览器中没有URL更改,只是服务器对它的理解不同。

重定向

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

过程

该过程保持不变,此图表对此进行了详细描述:

enter image description here

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

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

可以用来停止循环。 (因为它已经发生过一次就不会重写)。

答案 1 :(得分:4)

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

答案 2 :(得分:2)

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

此时,浏览器会针对GET标题中的网址发出新的Location请求。

答案 3 :(得分:2)

有两种形式的“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 :(得分:1)

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

  

Web服务器如何实现url重写机制并更改浏览器的地址栏?

URL重写和转发是两个完全不同的东西。 服务器无法控制您的浏览器,因此无法更改浏览器的网址,但可以要求您的浏览器转到其他网址。当您的浏览器从服务器获得响应时,完全取决于您的浏览器,以确定如何处理该响应:它可以遵循重定向,忽略它或真正意味着垃圾邮件服务器直到服务器放弃。服务器没有用于更改地址的“机制”,它只是服务器在特定资源移动到其他位置时所遵循的协议(HTTP 1.1),即3xx响应。