regex - 重写 URL 并使新 URL 显示在地址栏中

标签 regex apache .htaccess mod-rewrite

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

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]

最佳答案

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

通过 URL 重写,当 Web 服务器处理请求时,您可以选择将客户端发送的请求 URL 映射到由不同本地路径表示的本地资源。这样做的原因有很多,比如能够向用户呈现干净和简短的 URL,隐藏服务器上资源的内部结构,保护某些资源等。

浏览器通常不知道服务器重写了 URL(除非有其他指示),并且仍会在地址栏中显示原始请求的 URL。在客户端不知道的情况下,不可能远程操作客户端请求的 URL。

另一方面,HTTP 重定向是 HTTP 规范的一部分,是一种告诉客户端可以在不同位置找到请求的 URL 的方法。 Web 服务器通过发送带有重定向 URL 的“Location” header 和告诉客户端发生了什么的 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),除非您想为每个州编写规则。

关于regex - 重写 URL 并使新 URL 显示在地址栏中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13508136/

相关文章:

apache - .htaccess代码阻止了我网站的所有访问量,怎么了?

mysql - 如果不匹配正则表达式,如何禁止在mysql中插入?

php - 对于非常基本的 Markdown ,这些正则表达式可以工作吗?

apache - 如何防止.htaccess继承?

html - 通过域不同的网站

javascript - 在 .htaccess 中的 URL 重写规则后设置 javascript 文件和 css 文件的路径

AngularJS SEO 页面 404 header 状态代码

python - 如何查找带下标的单词?

regex - 通过 perl 脚本查看控制台消息来终止进程

Apache mod_evasive 白名单无法正常工作。