重写URL并在位置栏中显示新的URL

时间:2012-11-22 07:59:05

标签: regex apache .htaccess mod-rewrite

我正在使用以下代码重写一些网址:

RewriteEngine On
Options +FollowSymlinks
RewriteBase /
RewriteRule ^New_Hampshire/[a-zA-Z0-9_+\-\s]*\.html$ NH/

请记住,下面还有这条规则..

RewriteRule ^([a-zA-Z]{2})/ state.php?state=$1 [L]

现在,我想要实现的是,如果有人去了例如:

www.mydomain.com/New_Hampshire/index.html

我希望位置栏显示:

www.mydomain.com/NH/

通常我可以通过在末尾使用[R]标志来实现这一点,但是在这种情况下它不起作用,我猜它可能与辅助规则有关。

这可能吗?

另外,如何更改此设置以便重定向:

www.mydomain.com/New_Hampshire/

正如您所看到的,上面不包含index.html引用。

最后,如果我想制作这些301重定向,我会做一些像......

RewriteRule ^New_Hampshire/[a-zA-Z0-9_+\-\s]*\.html$ NH/ [R=301]

1 个答案:

答案 0 :(得分:2)

您需要了解URL重写(在您的情况下通过Apache的mod_rewrite实现)和重定向之间的区别,重定向是HTTP规范的一部分,通过向客户端(浏览器)发送标准HTTP标头和状态代码来实现。< / p>

使用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请求。如果这是主要请求(即不是对图像或脚本等资源的子请求),它也将替换地址栏中的位置。

请参阅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]

这会将客户端从任何 / 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)。

但是,这只是向您展示规则的一个示例。您可能需要处理第一条规则中的逻辑。因为某些东西需要将完整状态的名称(New_Hampshire)映射到快捷方式(NH),除非您想为每个州编写规则。