关于Apache的重定向配置(Rewrite)

本文详细介绍了Apache服务器中URL重写模块mod_rewrite的使用方法,包括配置步骤、常见应用场景及实例解析,帮助读者掌握如何通过正则表达式实现灵活的URL跳转。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  ps:之前在修改公司网站的时候,路径问题一直纠结了很长时间,服务器的环境和本地环境一模一样,就是指向不对,一查服务器的apache配置,果然被重定向了,特此记录一下下。

 

  Rewirte主要的功能就是实现URL的跳转,它的正则表达式是基于Perl语言。可基于服务器级的(httpd.conf)和目录级的 (.htaccess)两种方式。如果要想用到rewrite模块,必须先安装或加载rewrite模块。方法有两种一种是编译apache的时候就直接安装rewrite模块,别一种是编译apache时以DSO模式安装apache,然后再利用源码和apxs来安装rewrite模块。

基于服务器级的(httpd.conf)有两种方法,一种是在httpd.conf的全局下直接利用RewriteEngine on来打开rewrite功能;另一种是在局部里利用RewriteEngine on来打开rewrite功能,下面将会举例说明,需要注意的是,必须在每个virtualhost里用RewriteEngine on来打开rewrite功能。否则virtualhost里没有RewriteEngine on它里面的规则也不会生效。

基于目录级的(.htaccess),要注意一点那就是必须打开此目录的FollowSymLinks属性且在.htaccess里要声明RewriteEngine on。

2、举例说明:

例一.下面是在一个虚拟主机里定义的规则。功能是把client请求的主机前缀不是www.kiya.cn和70.40.213.183都跳转到主机前缀为http://www.kiya.cn,避免相同内容的网页有多个指向的域名,如http://kiya.cn。

   

[delphi]  view plain copy
  1. NameVirtualHost 70.40.213.183:80  
  2. ServerAdmin slj@kiya.cn  
  3. DocumentRoot “/web”  
  4. ServerName kiya.cn  
  5. RewriteEngine on #打开rewirte功能  
  6. RewriteCond %{HTTP_HOST} !^www.kiya.cn [NC] #声明Client请求的主机中前缀不是www.kiya.cn,其中 [NC] 的意思是忽略大小写  
  7. RewriteCond %{HTTP_HOST} !^70.40.213.183 [NC] #声明Client请求的主机中前缀不是70.40.213.183,其中 [NC] 的意思是忽略大小写  
  8. RewriteCond %{HTTP_HOST} !^$ #声明Client请求的主机中前缀不为空  
  9. RewriteRule ^(.*) http://www.kiya.cn/ [L] #含义是如果Client请求的主机中的前缀符合上述条件,则直接进行跳转到http://www.kiya.cn/,[L]意味着立即停止重写操作,并不再应用其他重写规则。这里的.*是指匹配所有URL中不包含换行字符,()括号的功能是把所有的字符做一个标记,以便于后面的应用.就是引用前面里的 (.*)字符。  

 

例二.将输入 en.tsas.cn 的域名时跳转到www.tsas.cn

   

[delphi]  view plain copy
  1. RewriteEngine on  
  2. RewriteCond %{HTTP_HOST} ^en.tsas.cn [NC]  
  3. RewriteRule ^(.*) http://www.tsas.cn/ [L]  

 

例三.赛卡软件近期更换了域名,新域名为www.tsas.cn, 更加简短好记。这时需要将原来的域名ss.kiya.cn, 以及论坛所在地址ss.kiya.cn/bbs/定向到新的域名,以便用户可以找到,并且使原来的论坛 URL 继续有效而不出现 404 未找到,比如原来的http://ss.kiya.cn/bbs/tread-60.html, 让它在新的域名下继续有效,点击后转发到http://bbs.tsas.cn/tread-60.html,而其他网页,如原先的http: //ss.kiya.cn/purchase不会到二级域名bbs.tsas.cn/purchase上,而是到 www.tsas.cn/purchase
按照这样的要求重定向规则应该这样写:

   

[c-sharp]  view plain copy
  1. RewriteEngine On  
  2. RewriteCond %{REQUEST_URI} ^/bbs/  
  3. RewriteRule ^bbs/(.*) http://bbs.tsas.cn/$1 [R=permanent,L]  
  4. RewriteCond %{REQUEST_URI} !^/bbs/  
  5. RewriteRule ^(.*) http://www.tsas.cn/$1 [R=permanent,L]  

 

3.Apache mod_rewrite规则重写的标志一览

    1) R[=code](force redirect) 强制外部重定向
    强制在替代字符串加上http://thishost[:thisport]/前缀重定向到外部的URL.如果code不指定,将用缺省的302 HTTP状态码。
    2) F(force URL to be forbidden)禁用URL,返回403HTTP状态码。
    3) G(force URL to be gone) 强制URL为GONE,返回410HTTP状态码。
    4) P(force proxy) 强制使用代理转发。
    5) L(last rule) 表明当前规则是最后一条规则,停止分析以后规则的重写。
    6) N(next round) 重新从第一条规则开始运行重写过程。
    7) C(chained with next rule) 与下一条规则关联

    如果规则匹配则正常处理,该标志无效,如果不匹配,那么下面所有关联的规则都跳过。

    8) T=MIME-type(force MIME type) 强制MIME类型
    9) NS (used only if no internal sub-request) 只用于不是内部子请求
    10) NC(no case) 不区分大小写
    11) QSA(query string append) 追加请求字符串
    12) NE(no URI escaping of output) 不在输出转义特殊字符
    例如:RewriteRule /foo/(.*) /bar?arg=P1%3d$1 [R,NE] 将能正确的将/foo/zoo转换成/bar?arg=P1=zoo
    13) PT(pass through to next handler) 传递给下一个处理
    例如:
    RewriteRule ^/abc(.*) /def$1 [PT] # 将会交给/def规则处理
    Alias /def /ghi
    14) S=num(skip next rule(s)) 跳过num条规则
    15) E=VAR:VAL(set environment variable) 设置环境变量

4.Apache rewrite例子集合

URL重定向

例子一:
同时达到下面两个要求:
1.用http://www.zzz.com/xxx.php 来访问 http://www.zzz.com/xxx/
2.用http://yyy.zzz.com 来访问 http://www.zzz.com/user.php?username=yyy 的功能

   

[c-sharp]  view plain copy
  1. RewriteEngine On  
  2. RewriteCond %{HTTP_HOST} ^www.zzz.com  
  3. RewriteCond %{REQUEST_URI} !^user.php$  
  4. RewriteCond %{REQUEST_URI} .php$  
  5. RewriteRule (.*).php$ http://www.zzz.com/$1/ [R]  
  6. RewriteCond %{HTTP_HOST} !^www.zzz.com  
  7. RewriteRule ^(.+) %{HTTP_HOST} [C]  
  8. RewriteRule ^([^.]+).zzz.com http://www.zzz.com/user.php?username=$1  

 

例子二:

/type.php?typeid=* –> /type*.html
/type.php?typeid=*&page=* –> /type*page*.html

   

[c-sharp]  view plain copy
  1. RewriteRule ^/type([0-9]+).html$ /type.php?typeid=$1 [PT]  
  2. RewriteRule ^/type([0-9]+)page([0-9]+).html$ /type.php?typeid=$1&page=$2 [PT]  

 

5.使用Apache的URL Rewrite配置多用户虚拟服务器

要实现这个功能,首先要在DNS服务器上打开域名的泛域名解析(自己做或者找域名服务商做)。比如,我就把 *.kiya.us和 *.kiya.cn全部解析到了我的IP地址70.40.213.183上。

然后,看一下我的Apache中关于*.kiya.us的虚拟主机的设定。

   

[c-sharp]  view plain copy
  1. ServerAdmin webmaster@kiya.us  
  2. DocumentRoot /home/www/www.kiya.us  
  3. ServerName dns.kiya.us  
  4. ServerAlias dns.kiya.us kiya.us *.kiya.us  
  5. CustomLog /var/log/httpd/osa/access_log.log” common  
  6. ErrorLog /var/log/httpd/osa/error_log.log”  
  7. AllowOverride None  
  8. Order deny,allow  
  9. #AddDefaultCharset GB2312  
  10. RewriteEngine on  
  11. RewriteCond %{HTTP_HOST} ^[^.]+.kiya.(cn|us)$  
  12. RewriteRule ^(.+) %{HTTP_HOST}$1 [C]  
  13. RewriteRule ^([^.]+).kiya.(cn|us)(.*)$ /home/www/www.kiya.us/sylvan$3?un=$1&%{QUERY_STRING} [L]  

 

在这段设定中,我把*.kiya.cn和*.kiya.us 的Document Root都设定到了 /home/www/www.kiya.us

继续看下去,在这里我就配置了URL Rewrite规则。

    下面一句
    RewriteRule ^(.+) %{HTTP_HOST}$1 [C] #把用户输入完整的地址(GET方式的参数除外)作为参数传给下一个规则,[C]是Chain串联下一个规则的意思
    RewriteRule ^([^.]+).kiya.(cn|us)(.*)$ /home/www/dev.kiya.us/sylvan$3?un=$1&%{QUERY_STRING} [L]
    # 最关键的是这一句,使用证则表达式解析用户输入的URL地址,把主机名中的用户名信息作为名为un的参数传给/home/www/dev.kiya.us 目录下的脚本,并在后面跟上用户输入的GET方式的传入参数。并指明这是最后一条规则([L]规则)。注意,在这一句中指明的重写后的地址用的是服务器上的绝对路径,这是内部跳转。如果使用http://xxxx这样的URL格式,则被称为外部跳转。使用外部跳转的话,浏览着的浏览器中的URL地址会改变成新的地址,而使用内部跳转则浏览器中的地址不发生改变,看上去更像实际的二级域名虚拟服务器。

设置后重启Apache服务器就大功告成了!
Update May 1, 2009

今天上网看到了有人提一个问题:

    求Rewrite 防盗链正则
    不允许www.im286.com www.chinaz.com 这两个网站盗链 , 其它的网站都可以盗链的规则怎么写.

论坛中的答案是:

   

[c-sharp]  view plain copy
  1. RewriteEngine On  
  2. RewriteCond %{HTTP_REFERER} chinaz.com [NC]  
  3. RewriteCond %{HTTP_REFERER} im286.com [NC]  
  4. RewriteRule .*.(jpg|jpeg|gif|png|rar|zip|txt|ace|torrent|gz|swf)$ http://www.xxx.com/fuck.png [R,NC,L]  

 

Update May 7, 2009

介绍一篇文章:http://lamp.linux.gov.cn/Apache/ApacheMenu/mod/mod_rewrite.html

Update May 24, 2009

一、关于是否需要使用完全转义,比如在 RewriteCond %{HTTP_REFERER} chinaz.com [NC] 中 把 chinaz.com 改成 chinaz.com
答案是,两者都是可以的。

二、今天在做 YOURcaddy.com (就是我去年做的PlanetCoachella的变形)的时候,在 GoDaddy 主机上无法正常转向,后来找到了问题:
在HostMonster以及我自己的机器上,是用
RewriteRule ^business/([^.]+)$ biz/detail.php?name=$1 [L]
达到改写的。而在Godaddy主机上,是这样:
RewriteRule ^business/([^.]+)$ /biz/detail.php?name=$1 [L]
目标文件前多了一个/
现在想想,可能是因为没有指定RewriteBase,至于到底是不是我改日再验证一下。

三、添加两个关于判断 USER AGENT 例子和自动添加.php扩展名及自动换.html到.php扩展名的例子:
1

   

[c-sharp]  view plain copy
  1. RewriteEngine on  
  2. RewriteCond %{HTTP_USER_AGENT} ^MSIE [NC,OR]  
  3. RewriteCond %{HTTP_USER_AGENT} ^Opera [NC]  
  4. RewriteRule ^.* – [F,L] #这里”-”表示没有替换,浏览器为IE和Opera的访客将被禁止访问。  

 

2

   

[delphi]  view plain copy
  1. RewriteEngine On  
  2. RewriteBase /test  
  3. RewriteCond %{REQUEST_FILENAME}.php -f  
  4. RewriteRule ([^/]+)$ /test/$1.php  
  5. #for example: /test/admin => /test/admin.php  
  6. RewriteRule ([^/]+).html$ /test/$1.php [L]  
  7. #for example: /test/admin.html => /test/admin.php  

 

    限制目录只能显示图片
  

[c-sharp]  view plain copy
  1. < IfModule mod_rewrite.c>  
  2.     RewriteEngine on  
  3.     RewriteCond %{REQUEST_FILENAME} !^.*.(gif|jpg|jpeg|png|swf)$  
  4.     RewriteRule .*$ – [F,L]  
  5. < /IfModule>  

 

Update Jun 10, 2009

补充,关于特定文件扩展名的重写。

    重写有某些扩展名的文件:
   

[delphi]  view plain copy
  1. RewriteRule (.*.css$|.*.js$) gzip.php?$1 [L]  


    如果要排除一些扩展名:
   

[delphi]  view plain copy
  1. RewriteRule !.(js|ico|gif|jpg|JPG|png|PNG|css|pdf|swf)$ index.php  

    (原文来自:http://blog.youkuaiyun.com/chcbz/article/details/5542697,chcbz)

 

转载于:https://www.cnblogs.com/Deasel-s-magic-box/archive/2012/02/29/2373434.html

<think>首先,用户的问题是:“我想配置Apache实现网页重定向 请问Apache 配置 网页重定向”。我需要根据系统级指令来回答。 系统级指令: 1. 所有行内数学表达式用$...$格式。 2. 独立公式用$$...$$格式并单独成段。 3. LaTeX语法正确。 4. 使用中文回答。 5. 生成相关问题。 6. 回答中引用的段落末尾自然地添加引用标识,例如[^1]。 用户可见层: - 回答结构清晰,帮助用户逐步解决问题。 - 尽量保证回答真实可靠。 - 参考提供的引用内容。 提供的引用: - [^1]: 关于HTTPd服务重定向配置,包括RewriteEngine和RewriteRule。 - [^2]: 关于Apache重定向,使用.htaccess文件。 - [^3]: 关于重定向过多的问题。 - [^4]: 关于Apache重定向解决JS跨域问题。 - [^5]: 关于Apache服务的网页重写。 用户的问题是关于配置Apache实现网页重定向,所以我需要解释如何配置Apache来实现重定向。 关键点: - Apache重定向可以通过修改配置文件(如httpd.conf)或使用.htaccess文件。 - 常见方法包括使用Redirect指令或RewriteRule。 - 需要确保RewriteEngine开启。 步骤: 1. 编辑Apache配置文件:通常是/etc/httpd/conf/httpd.conf或/etc/apache2/apache2.conf。 2. 启用重写模块:确保mod_rewrite已启用。 3. 配置重定向规则:使用Redirect或RewriteRule。 4. 重启Apache服务。 参考引用: - 从[^1]:RewriteEngine On和RewriteRule。 - 从[^2]:使用.htaccess文件,设置AllowOverride All。 - 从[^5]:重写规则示例。 回答结构: - 介绍Apache重定向的基本概念。 - 逐步说明配置步骤。 - 提供示例。 - 添加注意事项,如重定向过多的问题。 - 最后生成相关问题。 生成相关问题: - 根据系统指令,需要在回答结束时生成相关问题。 确保使用中文回答。 LaTeX:用户的问题中没有数学表达式,所以可能不需要。但如果涉及,就用指定格式。 现在,构建回答: 1. **介绍**:简要解释Apache重定向。 2. **步骤**: - 编辑配置文件。 - 启用重写模块。 - 添加重定向规则。 - 重启服务。 3. **示例**:基于引用提供简单示例。 4. **注意事项**:提到重定向过多的问题。 5. **相关问题**:生成几个相关问题。 相关问题想法: - 如何配置永久重定向(301)? - 如何使用.htaccess文件实现重定向? - 如何解决重定向过多的问题? - 重定向如何影响SEO? - Apache重定向的其他应用场景? 最终回答末尾添加相关问题。</think>### Apache 配置网页重定向指南 Apache 网页重定向是一种常见的服务器端配置,用于将用户请求从一个 URL 自动转发到另一个 URL。这在网站迁移、HTTPS 强制跳转或路径优化等场景中非常有用。下面我将基于 Apache 的官方文档和最佳实践,逐步指导您完成配置过程。整个过程需要修改 Apache 配置文件或使用 `.htaccess` 文件,并确保操作前备份文件以防意外。 #### 步骤 1: 编辑 Apache 配置文件 Apache重定向配置通常在主配置文件或虚拟主机文件中进行。以下是详细步骤: - **找到配置文件路径**: - Linux 系统默认路径:`/etc/httpd/conf/httpd.conf`(基于 Red Hat/CentOS)或 `/etc/apache2/apache2.conf`(基于 Debian/Ubuntu)。 - 使用文本编辑器打开文件,例如: ```bash sudo vi /etc/httpd/conf/httpd.conf ``` - **启用重写模块**: 确保 `mod_rewrite` 模块已加载。在配置文件中添加或取消注释以下行: ``` LoadModule rewrite_module modules/mod_rewrite.so ``` 如果模块未安装,需先安装(例如在 Ubuntu 上运行 `sudo a2enmod rewrite`)[^2][^4]。 - **设置 AllowOverride(可选,用于 .htaccess)**: 如果您想使用 `.htaccess` 文件(更灵活,无需重启服务),需在 `<Directory>` 部分设置: ``` <Directory "/var/www/html"> AllowOverride All # 将 None 改为 All </Directory> ``` 这允许 `.htaccess` 文件覆盖配置[^2]。 #### 步骤 2: 添加重定向规则 根据需求选择以下方法之一: - **方法 1: 使用 Redirect 指令(简单重定向)**: 适用于基础跳转,如 HTTP 到 HTTPS 或旧路径到新路径。在配置文件的 `<VirtualHost>` 或全局部分添加: ``` Redirect /old-path http://new-domain.com/new-path ``` 示例:将所有 HTTP 请求重定向到 HTTPS: ``` RewriteEngine On RewriteRule ^/(.*)$ https://localhost/$1 [R=301,L] ``` 这里 `R=301` 表示永久重定向(利于 SEO),`L` 表示最后一条规则[^1][^5]。 - **方法 2: 使用 RewriteRule(高级重定向)**: 支持正则表达式匹配,适合复杂场景(如跨域或路径模式)。例如,将 `/index.php` 重定向到子目录 `/a`: ``` RewriteEngine On RewriteRule ^/index\.php$ /a [R=302,L] ``` 或解决 JS 跨域问题(参考引用[^4]): ``` RewriteRule ^/http-bind/ http://im.303blog.org:9090/http-bind/ [P] ``` - **方法 3: 使用 .htaccess 文件(无需修改主配置)**: 在网站根目录(如 `/var/www/html`)创建 `.htaccess` 文件,添加规则: ``` Redirect /index.php http://10.0.0.1/a # 简单重定向RewriteEngine On RewriteRule ^old-page$ new-page [R=301] # 正则匹配重定向 ``` 这适用于无服务器权限的场景[^2]。 #### 步骤 3: 重启 Apache 服务 保存配置后,重启服务使更改生效: ```bash sudo systemctl restart httpd # Red Hat/CentOS 或 sudo systemctl restart apache2 # Debian/Ubuntu ``` 验证配置:访问旧 URL,检查是否自动跳转到新地址。 #### 注意事项 1. **重定向过多问题**:如果出现“生成了过多的重定向”错误(引用[^3]),检查规则是否循环(如 A 重定向到 B,B 又重定向回 A)。清除浏览器缓存或使用 `curl -I URL` 调试响应头。 2. **性能影响**:过度使用重定向可能降低网站速度。优先使用 `R=301`(永久)而非 `R=302`(临时),除非测试需要[^5]。 3. **安全与 SEO**:HTTPS 重定向提升安全性(参考[^1])。确保规则匹配精确,避免意外重定向。 4. **模块依赖**:`RewriteRule` 需要 `mod_rewrite`、`mod_proxy` 和 `mod_proxy_http` 模块。运行 `a2enmod proxy proxy_http rewrite` 启用(引用[^4])。 通过以上步骤,您应能成功配置重定向。如果问题持续,提供具体错误日志(`/var/log/httpd/error_log`)以进一步诊断。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值