在Apache服务器使用mod_rewrite模块重定向URL

在Web开发中,通常设置HTTP能在URL不映射文件系统中的文件时访问资源。 虽然可以在某种程度上使用重定向语句来解决这个问题,但是许多部署对于URL重写具有更复杂的需求。 Apache的mod_rewrite提供重写功能,以便用户使用简洁明了的URL进行交互,同时仍然能够为管理员提供他们认为合适的网站目录架构。

重写URL



块或.htaccess文件中,使用以下行启用mod_rewrite:

  1. RewriteEngine on

您可以创建任意数量的重写规则。 这些规则提供了服务器比较入站请求的模式。 如果请求与重写模式匹配,则服务器按照规则所述修改请求,并处理该请求。 下面是一个重写规则的例子:

  1. RewriteRule ^post-id/([0-9]+)$ /posts/$1.html

让我们解析这条规则:首先,请注意,第一个字符串是匹配传入请求的模式。 第二个字符串指定要提供的实际文件。 Mod_rewrite模式使用正则表达式语法:^匹配字符串的开头,$匹配字符串的结尾,这意味着重写引擎不会重写与模式部分匹配的字符串。
上面的例子会重写指定以/post-id/开头的路径的所有URL,并包含一个或多个数字(例如[0-9]+),在/posts/目录中提供相应的.html文件。 模式中的括号术语指定了作为$1,$2,$3等传递给第二个字符串的变量。
您可以创建和应用多个重写规则,但这些规则是顺序匹配的。 表示RewriteRules的顺序可以影响匹配的规则。
或者,您可以插入RewriteBase指令来修改重写规则的行为。 让我们假设:
这些指令是为/srv/www/example.com/public_html/目录指定的。
某些用户以http://example.com/post-id/200形式发送请求,其中200可能是长于一位数的任何数字。
某些用户以http://example.com/page/title-of-page的形式发送请求,其中“title of page”可能代表任何字符串。
这些文件位于/srv/www/example.com/public_html/objects/上,匹配请求文件名称,扩展名为.html。

  1. RewriteEngine on
  2. RewriteBase /objects
  3. RewriteRule ^post-id/([0-9]+)$ $1.html
  4. RewriteRule ^page/([^/]+)$ $1.html

上面的重写规则集作用如下:
http://example.com/post-id/200/,提供位于/srv/www/example.com/public_html/objects/200.html的文件
http://example.com/page/free-the-toast/,提供位于/srv/example.com/public_html/objects/free-the-toast.html的文件

在特定条件下重写URL



使用RewriteCond参数,您可以限制使用RewriteRule的条件。 让我们从WordPress应用程序的默认重写规则中获取以下示例:

  1. RewriteEngine On
  2. RewriteBase /
  3. RewriteCond %{REQUEST_FILENAME} !-f
  4. RewriteCond %{REQUEST_FILENAME} !-d
  5. RewriteRule . /index.php [L]

在此示例中,以上下文的顶层开始的所有请求都受重写规则的影响。 这由RewriteBase /指令指定。 上下文由在虚拟主机,目录块或.htaccess文件中指定伪指令的位置决定。
RewriteCond语句指示Apache仅当满足条件时才应用遵循的规则。 在上述示例中,匹配请求的文件名称在文件系统上不存在(例如,!-f),或者目录不存在(例如!-d)的请求。
简而言之,如果两者都为真,并且文件和目录都不存在,则Web服务器将请求附加到index.php。 也就是说,f用户请求http://example.com/?post=123或http://example.com/post/123,服务器将返回index.php?post=123或index.php/post/123。

mod_rewrite设置响应码



最后,有一些代码,你可以附加到一个RewriteRule,修改重写的行为。 在前面的例子RewriteRule ./index.php [L],我们看到代表“最后规则”的[L]选项。 这阻止Apache应用任何其他重写规则。 最常见的附加选项包括:
F告诉客户端该URL被禁止,用HTTP代码403响应。
N强制mod_rewrite重新开始重写过程,并允许多阶段重写。
R告诉客户端所请求的页面已经移动,具有用于临时重定向的HTTP代码302。 要表示该网页已永久移动,请指定“R=301”。
您可以在RewriteRule结尾处指定多个选项,用逗号分隔它们,如:[L,R=301]

标签:Apache 发布于:2019-11-21 15:21:22