Web服务器如何实现url重写机制并更改浏览器的地址栏?
我不是要求具体信息来配置apache,nginx,lighthttpd或其他!
我想知道当服务器想要重写url时会向客户端发送什么样的信息?
答案 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代码。然后客户端请求此页面。因此,浏览器中的地址会发生变化!
该过程保持不变,此图表对此进行了详细描述:
备注每次重写/重定向都会触发对重写规则的新调用(例外情况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响应。