Apache2.2 初级URL重写指南(RewriteRule)
### Apache2.2 URL重写指南(RewriteRule) #### 一、简介 在Web开发与维护过程中,URL重定向是一项非常重要的技术手段,尤其是在网站重构或者域名更改时,能够帮助用户平滑过渡到新的资源位置,同时也利于搜索引擎优化。Apache作为一款广泛使用的Web服务器软件,提供了强大的URL重写功能,通过`.htaccess`文件或Apache配置文件中的`RewriteRule`指令实现灵活的URL映射与重定向。 #### 二、基础概念 1. **RewriteEngine**:开启或关闭重写引擎。 2. **RewriteBase**:定义URL重写的基准路径,通常用于子目录下的`.htaccess`文件中。 3. **RewriteRule**:指定具体的重写规则,包括匹配模式、替换字符串以及可选标志等部分。 #### 三、RewriteRule详解 **RewriteRule**的基本语法为: ```apache RewriteRule pattern replacement [flags] ``` 其中: - **pattern**:正则表达式模式,用于匹配请求的URL。 - **replacement**:替换字符串,即重定向的目标URL。 - **flags**:可选标志,用于控制重定向的行为。 #### 四、示例解析 下面将结合题目提供的部分内容,详细解释几个典型的`RewriteRule`示例及其应用场景。 ##### 4.1 内容重定向 例如,将`/~user`格式的URL重定向至`/u/user`格式: ```apache RewriteRule ^/~([^/]+)/?(.*) /u/$1/$2 [R] ``` **解释**: - `^/~([^/]+)/?(.*)`:该模式匹配所有以`/~`开头的URL,并捕获第一个非斜杠字符作为用户名(即`$1`),剩余部分作为路径(即`$2`)。 - `/u/$1/$2`:将匹配的URL重定向为`/u/用户名/路径`的形式。 - `[R]`:表示重定向操作,返回一个临时重定向的状态码(通常是302)。 ##### 4.2 主域名规范化 为了确保所有访问都通过同一个主域名(例如`fully.qualified.domain.name`),可以使用以下规则: ```apache RewriteCond %{HTTP_HOST} !^fully\.qualified\.domain\.name[NC] RewriteCond %{HTTP_HOST} !^$ RewriteCond %{SERVER_PORT} !^80$ RewriteRule ^/(.*) http://fully.qualified.domain.name:%{SERVER_PORT}/$1 [L,R] ``` **解释**: - `RewriteCond`:判断当前请求的主机名是否不等于`fully.qualified.domain.name`(忽略大小写)、是否为空以及端口号是否不是80。 - `RewriteRule`:如果以上条件满足,则将当前URL重定向到规范化的域名加上原始路径。 ##### 4.3 内容重定向的其他示例 - 将根路径重定向到特定目录: ```apache RewriteEngine on RewriteRule ^/$ /about/ [R] ``` - 修正缺少尾部斜杠的问题: ```apache RewriteEngine on RewriteBase /~quux/ RewriteCond %{REQUEST_FILENAME} -d RewriteRule ^(.*[^/])$ $1/ [R] ``` 这段代码的作用是,如果请求的是一个目录但没有尾部斜杠,则自动添加斜杠并重定向。 - 处理多站点重定向: ```apache RewriteEngine on RewriteRule ^/~(.+) http://newserver/~$1 [R,L] ``` 将以`/~user`开头的所有请求重定向到新服务器上的相应路径。 - 重定向到特定目录页面: ```apache RewriteEngine on RewriteCond /your/docroot/dir1/%{REQUEST_FILENAME} -f RewriteRule ^(.+)/your/docroot/dir1/$1 [L] RewriteCond /your/docroot/dir2/%{REQUEST_FILENAME} -f RewriteRule ^(.+)/your/docroot/dir2/$1 [L] ``` 该规则检查请求的文件是否存在于指定目录中,若存在则进行重定向。 - 处理状态参数: ```apache RewriteEngine on RewriteRule ^(.*)/S=([^/]+)/(.*)$1/$3 [E=STATUS:$2] ``` 此规则可以用来处理URL中的状态参数,并将其存储为环境变量供后端脚本使用。 - 用户特定子域名的重定向: ```apache RewriteEngine on RewriteCond %{HTTP_HOST} ^www\.[^.]+\.host\.com$ RewriteRule ^(.+)%{HTTP_HOST}$1 [C] RewriteRule ^www\.([^.]+)\.host\.com(.*) /home/$1$2 ``` 这些规则用于将特定子域名的请求重定向到用户的个人目录。 #### 五、总结 通过上述示例可以看出,Apache的`RewriteRule`指令非常强大且灵活,可以实现复杂的URL重定向逻辑。开发者可以根据实际需求编写相应的规则,实现网站结构的调整、SEO优化等多种目的。然而,需要注意的是,编写规则时需谨慎,避免造成循环重定向等问题。此外,在部署前应充分测试,确保规则的正确性和效率。
描述:
在有些web服务器上,一个资源会拥有多个URL。在实际应用和发布中应该使用的是规范的URL,其他的则是简写或者只在内部使用。无论用户在请求中使用什么形式的URL,最终看见的都应该是规范的URL。
解决方案:
对所有不规范的URL执行一个外部HTTP重定向,以改变它在浏览器地址栏中的显示及其后继请求。下例中的规则集用规范的/u/user替换/~user,并修正了/u/user所遗漏的后缀斜杠。
RewriteRule ^/~([^/]+)/?(.*) /u/$1/$2 [R]
RewriteRule ^/([uge])/([^/]+)$ /$1/$2/ [R]
规范化主机名
描述:
这个规则的目的是强制使用特定的主机名以代替其他名字。比如,你想强制使用www.example.com代替example.com,就可以在以下方案的基础上进行修改:
解决方案:
对运行在非80端口的站点
RewriteCond %{HTTP_HOST} !^fully\.qualified\.domain\.name [NC]
RewriteCond %{HTTP_HOST} !^$
RewriteCond %{SERVER_PORT} !^80$
RewriteRule ^/(.*) http://fully.qualified.domain.name:%{SERVER_PORT}/$1 [L,R]
对运行在80端口的站点
RewriteCond %{HTTP_HOST} !^fully\.qualified\.domain\.name [NC]
RewriteCond %{HTTP_HOST} !^$
RewriteRule ^/(.*) http://fully.qualified.domain.name/$1 [L,R]
移动过的DocumentRoot
描述:
通常,web服务器的DocumentRoot直接对应于URL"/",但是它常常不是处于最高的一级。比如,你希望访问者在进入网站时首先进入/about/目录。可以使用下面给出的规则集。
解决方案:
只需将"/"重定向到"/about/"即可:
RewriteEngine on
RewriteRule ^/$ /about/ [R]
也可以使用RedirectMatch指令解决问题:
RedirectMatch ^/$ http://example.com/e/www/
结尾斜杠问题
描述:
每个网管对引用目录的结尾斜杠问题都有一本苦经,如果遗漏了,服务器会产生一个错误,因为如果请求是"/~quux/foo"而不是"/~quux/foo/",服务器就会去找一个叫foo的文件,而它是一个目录,所以就报错了。通常,可以使用这个FAQ entry里面提到的方法解决问题。但是有时候需要使用重写规则来解决问题,比如,在应用了许多复杂的重写规则之后。
解决方案:
解决这个微妙问题的方案是让服务器自动添加后缀斜杠。为了达到目的,必须使用一个外部重定向,以使浏览器能够正确地处理后继的请求(比如对图片的请求)。如果仅仅执行一个内部重写,可能仅仅对目录页面有效,而对含有相对URL的图片的页面无效,因为浏览器有请求内嵌目标的可能。比如,如果不用外部重定向,对/~quux/foo/index.html页面中的image.gif的请求将变成对/~quux/image.gif的请求!所以,应该这样写:
RewriteEngine on
RewriteBase /~quux/
RewriteRule ^foo$ foo/ [R]
又懒又疯狂的做法是把这些写入其宿主目录中的顶级.htaccess中:
RewriteEngine on
RewriteBase /~quux/
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^(.+[^/])$ $1/ [R]
剩余8页未读,继续阅读
- 粉丝: 0
- 资源: 2
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助