您需要了解 URL 重写(在您的情况下通过 Apache 的 mod_rewrite 实现)和重定向之间的区别,重定向是 HTTP 规范的一部分,通过向客户端(浏览器)发送标准 HTTP 标头和状态代码来实现。
通过 URL 重写,当 Web 服务器处理请求时,您可以选择将客户端发送的请求 URL 映射到由不同本地路径表示的本地资源。这样做的原因有多种,例如能够向用户呈现干净且简短的 URL、隐藏服务器上资源的内部结构、保护某些资源等。
浏览器通常不知道 URL 已被服务器重写(除非有其他指示),并且仍会在地址栏中显示原始请求的 URL。在客户端不知情的情况下,不可能远程操作客户端请求的 URL。
另一方面,HTTP 重定向是 HTTP 规范的一部分,是一种告诉客户端可以在不同位置找到所请求的 URL 的方法。 Web 服务器通过发送带有重定向 URL 的“Location”标头和告诉客户端发生了什么情况的 HTTP 状态代码来实现此目的。为此有几种 30x 状态代码,最常用的是 301,用于告诉客户端资源已永久移动,从现在开始应通过新 URL 进行寻址;302,用于告诉浏览器资源已找到,但只是暂时的驻留在新的 URL 下(当您在规则中指定 R 标志时,Apache 的实现默认使用 302)。
客户端将收到包含新位置和状态代码的 HTTP 响应,并向新 URL 发出新的 HTTP 请求。如果这是主要请求(即不是对图像或脚本等资源的子请求),它还将替换地址栏中的位置。
See http://httpd.apache.org/docs/current/rewrite/flags.html#flag_r http://httpd.apache.org/docs/current/rewrite/flags.html#flag_r
请注意,Apache 的文档建议将 L 标志与重定向标志一起使用(例如 [R, L] 或 [R=301, L]),否则您可能会得到意外的结果(因为它将继续处理以下规则)。这可能就是您的 R 标志不起作用的原因。
所以,你可以这样做(只是一个例子):
RewriteRule ^New_Hampshire.* NH/ [R=301, L]
这会将客户端重定向到any/New_Hampshire 前缀(带或不带 *.html)URL,为 NH/ 并更改地址栏。
然后是下一个规则:
RewriteRule ^NH/? state.php?state=NH [L]
或者更通用:
RewriteRule ^([a-zA-Z]{2})/? state.php?state=$1 [L]
这将捕获 NH(或其他状态)URL 并将其重写为正确的实际资源 (state.php)。
BUT,这只是一个向您展示规则的示例。您可能需要处理第一条规则中的逻辑。因为某些东西需要将完整的州名称(New_Hampshire)映射到快捷方式(NH),除非您想为每个州编写规则。