`
haohappy2
  • 浏览: 326398 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Apache RewriteRule

PHP 
阅读更多

Apache模块 mod_rewrite提供了一个基于正则表达式分析器的重写引擎来实时重写URL请求。它支持每个完整规则可以拥有不限数量的子规则以及附加条件规则的灵活而且强大的URL操作机制。这里着重介绍
RewriteRule 规则以及参数说明。

Apache模块 mod_rewrite
提供了一个基于正则表达式分析器的重写引擎来实时重写URL请求。它支持每个完整规则可以拥有不限数量的子规则以及附加条件规则的灵活而且强大的URL操作机制。此URL操作可以依赖于各种测试,比如服务器变量、环境变量、HTTP头、时间标记,甚至各种格式的用于匹配URL组成部分的查找数据库。

 

此模块可以操作URL的所有部分(包括路径信息部分),在服务器级的(httpd.conf)和目录级的(.htaccess)配置都有效,还可以生成最终请求字符串。此重写操作的结果可以是内部子处理,也可以是外部请求的转向,甚至还可以是内部代理处理。

 

这里着重介绍一下 RewriteRule
的规则以及参数说明。RewriteRule指令是重写引擎的根本。此指令可以多次使用。每个指令定义一个简单的重写规则。这些规则的定义顺序尤为重要——在运行时,规则是按这个顺序逐一生效的。

  1. RewriteRule Pattern Substitution [flags]

 

Pattern是一个作用于当前URL的perl兼容的正则表达式。"当前URL"是指该规则生效时刻的URL的值。它可能与被请求的URL截然不同,因为其他规则可能在此之前已经发生匹配并对它做了改动。

 

Substitution是当原始URL与Pattern相匹配时,用来替代(或替换)的字符串。除了纯文本,还可以包含:
对Pattern的反向引用($N)

对最后匹配的RewriteCond的反向引用(%N)
规则条件测试字符串(%{VARNAME})中的服务器变量

映射函数调用(${mapname:key|default})

 

[flags]标记作为RewriteRule指令的第三个参数,是一个包含以逗号分隔的下列标记的列表:
'chain|C'(链接下一规则)
此标记使当前规则与下一个规则相链接。它产生这样的效果:如果一个规则被匹配,则继续处理其后继规则,也就是这个标记不起作用;如果该规则不被匹配,则其后继规则将被跳过。比如,在一个目录级规则中执行一个外部重定向时,你可能需要删除".www"(此处不应该出现".www")。

'cookie|CO=NAME:VAL:domain[:lifetime[:path]]'(设置cookie)
在客户端设置一个cookie。cookie的名称是NAME,值是VAL。domain是该cookie的域,比如'.apache.org',可选的lifetime是cookie的有效期(分钟),可选的path是cookie的路径。

'env|E=VAR:VAL'(设置环境变量)
此标记将环境变量VAR的值为VAL,VAL可以包含可扩展的正则表达式反向引用($N和%N)。此标记可以多次使用以设置多个变量。这些变量可以在其后许多情况下被间接引用,通常是在XSSI(<!--#echo
var="VAR"-->)或CGI($ENV{'VAR'})中,也可以在后继的RewriteCond指令的CondPattern参数中通过%{ENV:VAR}引用。使用它可以记住从URL中剥离的信息。

'forbidden|F'(强制禁止URL)
强制禁止当前URL,也就是立即反馈一个HTTP响应码403(被禁止的)。使用这个标记,可以链接若干个RewriteConds来有条件地阻塞某些URL。

'gone|G'(强制废弃URL)
强制当前URL为已废弃,也就是立即反馈一个HTTP响应码410(已废弃的)。使用这个标记,可以标明页面已经被废弃而不存在了。

'handler|H=Content-handler'(强制指定内容处理器)
强自制定目标文件的内容处理器为Content-handler。例如,用来模拟mod_alias模块的ScriptAlias指令,以强制映射文件夹内的所有文件都由"cgi-script"处理器处理。

'last|L'(结尾规则)
立即停止重写操作,并不再应用其他重写规则。它对应于Perl中的last命令或C语言中的break命令。这个标记用于阻止当前已被重写的URL被后继规则再次重写。例如,使用它可以重写根路径的URL('/')为实际存在的URL(比如:'/e/www/')。

'next|N'(从头再来)
重新执行重写操作(从第一个规则重新开始)。此时再次进行处理的URL已经不是原始的URL了,而是经最后一个重写规则处理过的URL。它对应于Perl中的next命令或C语言中的continue命令。此标记可以重新开始重写操作(立即回到循环的开头)。但是要小心,不要制造死循环!

'nocase|NC'(忽略大小写)
它使Pattern忽略大小写,也就是在Pattern与当前URL匹配时,'A-Z'和'a-z'没有区别。

'noescape|NE'(在输出中不对URI进行转义)
此标记阻止mod_rewrite对重写结果应用常规的URI转义规则。
一般情况下,特殊字符('%', '$', ';'等)会被转义为等值的十六进制编码('%', '$',
';'等)。此标记可以阻止这样的转义,以允许百分号等符号出现在输出中,比如:

  1. RewriteRule /foo/(.*) /bar?arg=P1\=$1 [R,NE]

 

可以使'/foo/zed转向到一个安全的请求'/bar?arg=P1=zed'。
'nosubreq|NS'(不对内部子请求进行处理)
在当前请求是一个内部子请求时,此标记强制重写引擎跳过该重写规则。比如,在mod_include试图搜索目录默认文件(index.xxx)时,Apache会在内部产生子请求。对于子请求,重写规则不一定有用,而且如果整个规则集都起作用,它甚至可能会引发错误。所以,可以用这个标记来排除某些规则。
使用原则:如果你为URL添加了CGI脚本前缀,以强制它们由CGI脚本处理,但对子请求处理的出错率(或者资源开销)很高,在这种情况下,可以使用这个标记。

'proxy|P'(强制为代理)
此标记使替换成分被内部地强制作为代理请求发送,并立即中断重写处理,然后把处理移交给mod_proxy模块。你必须确保此替换串是一个能够被mod_proxy处理的有效URI(比如以http://hostname开头),否则将得到一个代理模块返回的错误。使用这个标记,可以把某些远程成分映射到本地服务器域名空间,从而增强了ProxyPass指令的功能。

注意:要使用这个功能,必须已经启用了mod_proxy模块。
'passthrough|PT'(移交给下一个处理器)
此标记强制重写引擎将内部request_rec结构中的uri字段设置为filename字段的值,这个小小的修改使得RewriteRule指令的输出能够被(从URI转换到文件名的)Alias,
ScriptAlias, Redirect等指令进行后续处理[原文:This flag is just a hack to enable
post-processing of the output of RewriteRule directives, using Alias,
ScriptAlias, Redirect, and other directives from various URI-to-filename
translators.]。举一个能说明其含义的例子: 如果要将/abc重写为/def,
然后再使用mod_alias将/def转换为/ghi,可以这样:

  1. RewriteRule ^/abc(.*) /def$1 [PT]
  2. Alias /def /ghi

 

如果省略了PT标记,虽然将uri=/abc/...重写为filename=/def/...的部分运作正常,但是后续的mod_alias在试图将URI转换到文件名时会遭遇失效。

注意:如果需要混合使用多个将URI转换到文件名的模块时,就必须使用这个标记。。此处混合使用mod_alias和mod_rewrite就是个典型的例子。
'qsappend|QSA'(追加查询字符串)
此标记强制重写引擎在已有的替换字符串中追加一个查询字符串,而不是简单的替换。如果需要通过重写规则在请求串中增加信息,就可以使用这个标记。

'redirect|R
[=code]'(强制重定向)

若Substitution以http://thishost[:thisport]/(使新的URL成为一个URI)开头,可以强制性执行一个外部重定向。如果没有指定code,则产生一个HTTP响应码302(临时性移动)。如果需要使用在300-400范围内的其他响应代码,只需在此指定即可(或使用下列符号名称之一:temp(默认),
permanent,
seeother)。使用它可以把规范化的URL反馈给客户端,如将"/~"重写为"/u/",或始终对/u/user加上斜杠,等等。
注意:在使用这个标记时,必须确保该替换字段是一个有效的URL。否则,它会指向一个无效的位置!并且要记住,此标记本身只是对URL加上http://thishost[:thisport]/前缀,重写操作仍然会继续进行。通常,你还会希望停止重写操作而立即重定向,那么就还需要使用'L'标记。

'skip|S=num'(跳过后继规则)
此标记强制重写引擎跳过当前匹配规则之后的num个规则。它可以模拟if-then-else结构:最后一个规则是then从句,而被跳过的skip=N个规则是else从句。注意:它和'chain|C'标记是不同的!

'type|T=MIME-type'(强制MIME类型)
强制目标文件的MIME类型为MIME-type,可以用来基于某些特定条件强制设置内容类型。比如,下面的指令可以让.php文件在以.phps扩展名调用的情况下由mod_php按照PHP源代码的MIME类型(application/x-httpd-php-source)显示:

  1. RewriteRule ^(.+\.php)s$ $1 [T=application/x-httpd-php-source]

 

 

 

RewriteRule
example

 

1.If http://example.com/foo/bar
does not exist, redirect to http://other.example.com/foo/bar.
(Put this in an .htaccess file in your top-level web directory.)

  1. # .htaccess in root of example.com
  2. RewriteEngine On
  3. RewriteCond %{REQUEST_FILENAME} !-f
  4. RewriteCond %{REQUEST_FILENAME} !-d
  5. RewriteRule ^(.*)$ http://other.example.com/$1 [R]

 

2. Handle all requests for top-level .html files and files with no extensions (http://example.com/foo, http://example.com/foo.html) with a
single PHP program /foo/show.php. Also, ignore trailing characters in
set { : ; , . } so URLs
like "http://example.com/foo." can be copied-n-pasted from
plain text sentences by inattentive users.

  1. # .htaccess in root of example.com
  2. RewriteRule ^/?([^/]*\.html?|[^\./]*)[:;,\.]*$ /foo/show.php [L,NS]

 

Examples:

  1. http://tomclegg.net/rewriterule
  2. http://tomclegg.net/rewriterule.html;

 

3. Redirect GET requests for http://example.com/foo/bar to http://example.com/bar (and /foo/bar.html to /bar.html). Handle POST requests with
PHP program rather than attempting to redirect a POST (which is unlikely to work
well).

  1. # .htaccess in foo folder in example.com's document root
  2. RewriteEngine On
  3. RewriteCond %{REQUEST_METHOD} GET
  4. RewriteRule ^/?([^/]*\.html?|[^\./]*)[:;,\.]*$ /$1 [R,L,NS]
  5. RewriteCond %{REQUEST_METHOD} POST
  6. RewriteRule ^/?([^/]*\.html?|[^\./]*)[:;,\.]*$ /foo/show.php [L,NS]

 

Examples:

  1. http://tomclegg.net/w/rewriterule
  2. http://tomclegg.net/w/rewriterule.html;

 

Apache Rewrite 规则详解

 

1、Rewrite规则简介:

 

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.colorme.com和203.81.23.202都跳转到主机前缀为http://www.colorme.com.cn,避免当用户在地址栏写入http://colorme.com.cn时不能以会员方式登录网站。

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

 


例二.将输入 folio.test.com 的域名时跳转到profile.test.com

  1. listen 8080
  2. NameVirtualHost 10.122.89.106:8080
  3. ServerAdmin webmaster@colorme.com.cn
  4. DocumentRoot "/usr/local/www/apache22/data1/"
  5. ServerName profile.test.com
  6. RewriteEngine on
  7. RewriteCond %{HTTP_HOST} ^folio.test.com [NC]
  8. RewriteRule ^/(.*) http://profile.test.com/ [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\=$1 [R,NE]
将能正确的将/foo/zoo转换成/bar?arg=P1=zed
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例子集合

 

   在 httpd 中将一个域名转发到另一个域名虚拟主机世界近期更换了域名,新域名为 www.wbhw.com, 更加简短好记。这时需要将原来的域名webhosting-world.com, 以及论坛所在地址
webhosting-world.com/forums/定向到新的域名,以便用户可以找到,并且使原来的论坛 URL 继续有效而不出现 404
未找到,比如原来的http://www.webhosting-world.com/forums/-f60.html,
让它在新的域名下继续有效,点击后转发到http://bbs.wbhw.com/-f60.html, 这就需要用 apache 的 Mod_rewrite
功能来实现。

 

在中添加下面的重定向规则:

  1. RewriteEngine On
  2. # Redirect webhosting-world.com/forums to bbs.wbhw.com
  3. RewriteCond %{REQUEST_URI} ^/forums/
  4. RewriteRule /forums/(.*) http://bbs.wbhw.com/$1 [R=permanent,L]
  5. # Redirect webhosting-world.com to wbhw.com
  6. RewriteCond %{REQUEST_URI} !^/forums/
  7. RewriteRule /(.*) http://www.wbhw.com/$1 [R=permanent,L]

 

添加了上面的规则以后, 里的全部内容如下:

  1. ServerAlias webhosting-world.com
  2. ServerAdmin admin@webhosting-world.com
  3. DocumentRoot /path/to/webhosting-world/root
  4. ServerName www.webhosting-world.com
  5. RewriteEngine On
  6. # Redirect webhosting-world.com/forums to bbs.wbhw.com
  7. RewriteCond %{REQUEST_URI} ^/forums/
  8. RewriteRule /forums/(.*) http://bbs.wbhw.com/$1 [R=permanent,L]
  9. # Redirect webhosting-world.com to wbhw.com
  10. RewriteCond %{REQUEST_URI} !^/forums/
  11. RewriteRule /(.*) http://www.wbhw.com/$1 [R=permanent,L]

 

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 的功能

  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

  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服务器上打开域名的泛域名解析(自己做或者找域名服务商做)。比如,我就把 *.semcase.com和
*.semcase.cn全部解析到了我的这台Linux Server上。

 

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

  1. #*.com,*.osall.net
  2. ServerAdmin webmaster@semcase.com
  3. DocumentRoot /home/www/www.semcase.com
  4. ServerName dns.semcase.com
  5. ServerAlias dns.semcase.com semcase.com semcase.net *.semcase.com *.semcase.net
  6. CustomLog /var/log/httpd/osa/access_log.log" common
  7. ErrorLog /var/log/httpd/osa/error_log.log"
  8. AllowOverride None
  9. Order deny,allow
  10. #AddDefaultCharset GB2312
  11. RewriteEngine on
  12. RewriteCond %{HTTP_HOST} ^[^.]+\.osall\.(com|net)$
  13. RewriteRule ^(.+) %{HTTP_HOST}$1 [C]
  14. RewriteRule ^([^.]+)\.osall\.(com|net)(.*)$
  15. /home/www/www.semcase.com/sylvan$3?un=$1&%{QUERY_STRING} [L]

 

在这段设定中,我把*.semcase.net和*.semcase.com 的Document Root都设定到了
/home/www/www.semcase.com

 

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

 

这样设置后,重启Apache服务器,测试一下,就大功告成了!

 

13 个mod_rewrite 应用举例

 

1.给子域名加www标记
RewriteCond
%{HTTP_HOST} ^([a-z.]+)?example\.com$ [NC]
RewriteCond %{HTTP_HOST} !^www\.
[NC]
RewriteRule .? http://www.xample.com%{REQUEST_URI} [R=301,L]

这个规则抓取二级域名的%1变量,如果不是以www开始,那么就加www,以前的域名以及{REQUEST_URI}会跟在其后。

2.去掉域名中的www标记

RewriteCond %{HTTP_HOST} !^example\.com$ [NC]

RewriteRule .? http://example.com%{REQUEST_URI}
[R=301,L]


3.去掉www标记,但是保存子域名
RewriteCond %{HTTP_HOST} ^www\.(([a-z0-9_]+\.)?example\.com)$ [NC]

RewriteRule .? http://%1%{REQUEST_URI}
[R=301,L]

这里,当匹配到1%变量以后,子域名才会在%2(内部原子)中抓取到,而我们需要的正是这个%1变量。


4.防止图片盗链

一些站长不择手段的将你的图片盗链在他们网站上,耗费你的带宽。你可以加一下代码阻止这种行为。
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER}
!^http://(www\.)?example\.com/ [NC]
RewriteRule \.(gif|jpg|png)$ - [F]

如果{HTTP_REFERER}值不为空,或者不是来自你自己的域名,这个规则用[F]FLAG阻止以gif|jpg|png 结尾的URL

如果对这种盗链你是坚决鄙视的,你还可以改变图片,让访问盗链网站的用户知道该网站正在盗用你的图片。
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER}
!^http://(www\.)?example\.com/.*$ [NC]
RewriteRule \.(gif|jpg|png)$ 你的图片地址
[R=301,L]
除了阻止图片盗链链接,以上规则将其盗链的图片全部替换成了你设置的图片。
你还可以阻止特定域名盗链你的图片:

RewriteCond %{HTTP_REFERER}
!^http://(www\.)?leech_site\.com/ [NC]
RewriteRule \.(gif|jpg|png)$ -
[F,L]

这个规则将阻止域名黑名单上所有的图片链接请求。

当然以上这些规则都是以{HTTP_REFERER}获取域名为基础的,如果你想改用成IP地址,用{REMOTE_ADDR}就可以了。

5.如果文件不存在重定向到404页面

如果你的主机没有提供404页面重定向服务,那么我们自己创建。
RewriteCond
%{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule
.? /404.php [L]

这里-f匹配的是存在的文件名,-d匹配的存在的路径名。这段代码在进行404重定向之前,会判断你的文件名以及路径名是否存在。你还可以在404页面上加一个?url=$1参数:

RewriteRule ^/?(.*)$ /404.php?url=$1
[L]

这样,你的404页面就可以做一些其他的事情,例如默认信心,发一个邮件提醒,加一个搜索,等等。

6.重命名目录
如果你想在网站上重命名目录,试试这个:

RewriteRule ^/?old_directory/([a-z/.]+)$
new_directory/$1 [R=301,L]

在规则里我添加了一个“.”(注意不是代表得所有字符,前面有转义符)来匹配文件的后缀名。


7.将.html后缀名转换成.php
前提是.html文件能继续访问的情况下,更新你的网站链接。

RewriteRule ^/?([a-z/]+)\.html$ $1.php
[L]

这不是一个网页重定向,所以访问者是不可见的。让他作为一个永久重定向(可见的),将FLAG修改[R=301,L]。


8.创建无文件后缀名链接
如果你想使你的PHP网站的链接更加简洁易记-或者隐藏文件的后缀名,试试这个:

RewriteRule ^/?([a-z]+)$ $1.php
[L]

如果网站混有PHP以及HTML文件,你可以用RewriteCond先判断该后缀的文件是否存在,然后进行替换:
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule
^/?([a-zA-Z0-9]+)$ $1.php [L]
RewriteCond %{REQUEST_FILENAME}.html -f

RewriteRule ^/?([a-zA-Z0-9]+)$ $1.html
[L]

如果文件是以.php为后缀,这条规则将被执行。

9.检查查询变量里的特定参数
如果在URL里面有一个特殊的参数,你可用RewriteCond鉴别其是否存在:

RewriteCond %{QUERY_STRING} !uniquekey=
RewriteRule
^/?script_that_requires_uniquekey\.php$ other_script.php
[QSA,L]

以上规则将检查{QUERY_STRING}里面的uniquekey参数是否存在,如果{REQUEST_URI}值为script_that_requires_uniquekey,将会定向到新的URL。


10.删除查询变量
Apache的mod_rewrite模块会自动辨识查询变量,除非你做了以下改动:

a).分配一个新的查询参数(你可以用[QSA,L]FLAG保存最初的查询变量)

b).在文件名后面加一个“?”(比如index.php?)。符号“?”不会在浏览器的地址栏里显示。

11.用新的格式展示当前URI

如果这就是我们当前正在运行的URLs:/index.php?id=nnnn。我们非常希望将其更改成/nnnn并且让搜索引擎以新格式展现。首先,我们为了让搜索引擎更新成新的,得将旧的URLs重定向到新的格式,但是,我们还得保证以前的index.php照样能够运行。是不是被我搞迷糊了?

实现以上功能,诀窍就在于在查询变量中加了一个访问者看不到的标记符“marker”。我们只将查询变量中没有出现“marker”标记的链接进行重定向,然后将原有的链接替换成新的格式,并且通过[QSA]FLAG在已有的参数加一个“marker”标记。以下为实现的方式:

RewriteCond %{QUERY_STRING} !marker
RewriteCond
%{QUERY_STRING} id=([-a-zA-Z0-9_+]+)
RewriteRule ^/?index\.php$ %1?
[R=301,L]
RewriteRule ^/?([-a-zA-Z0-9_+]+)$ index.php?marker &id=$1
[L]

这里,原先的URL:http://www.example.com/index.php?id=nnnn,不包含marker,所以被第一个规则永久重定向到http://www.example.com/nnnn,第二个规则将http://www.example.com/nnnn反定向到http://www.example.com/index.php?marker
&id=nnnn,并且加了marker以及id=nnnn两个变量,最后mod_rewrite就开始进行处理过程。
第二次匹配,marker被匹配,所以忽略第一条规则,这里有一个“.”字符会出现在http://www.example.com/index.php?marker
&id=nnnn中,所以第二条规则也会被忽略,这样我们就完成了。
注意,这个解决方案要求Apache的一些扩展功能,所以如果你的网站放于在共享主机中会遇到很多障碍。

12.保证安全服务启用
Apache可以用两种方法辨别你是否开启了安全服务,分别引用{HTTPS}和{SERVER_PORT}变量:

RewriteCond %{REQUEST_URI} ^secure_page\.php$

RewriteCond %{HTTPS} !on
RewriteRule ^/?(secure_page\.php)$ https://www.example.com/$1
[R=301,L]

以上规则测试{REQUEST_URI}值是否等于我们的安全页代码,并且{HTTPS}不等于on。如果这两个条件同时满足,请求将被重定向到安全服务URI.另外你可用{SERVER_PORT}做同样的测试,443是常用的安全服务端口

RewriteCond %{REQUEST_URI} ^secure_page\.php$

RewriteCond %{SERVER_PORT} !^443$
RewriteRule ^/?(secure_page\.php)$ https://www.example.com/$1
[R=301,L]

13.在特定的页面上强制执行安全服务

遇到同一个服务器根目录下分别有一个安全服务域名和一个非安全服务域名,所以你就需要用RewriteCond
判断安全服务端口是否占用,并且只将以下列表的页面要求为安全服务:
RewriteCond
%{SERVER_PORT} !^443$
RewriteRule ^/?(page1|page2|page3|page4|page5)$ https://www.example.com/%1 [R=301,L]

以下是怎样将没有设置成安全服务的页面返回到80端口:
RewriteCond %{
SERVER_PORT } ^443$
RewriteRule !^/?(page6|page7|page8|page9)$ http://www.example.com%{REQUEST_URI} [R=301,L]

分享到:
评论

相关推荐

    Apache2.2 初级URL重写指南(RewriteRule)

    ### Apache2.2 URL重写指南(RewriteRule) #### 一、简介 在Web开发与维护过程中,URL重定向是一项非常重要的技术手段,尤其是在网站重构或者域名更改时,能够帮助用户平滑过渡到新的资源位置,同时也利于搜索...

    Apache2.4 Win64位

    apache No input filespecified,今天是我们配置apache RewriteRule时出现这种问题,解决办法很简单如下 打开.htaccess 在RewriteRule 后面的index.php教程后面添加一个“?” 完整代码如下 .htaccess ...

    RewriteRule使用

    在Apache服务器配置中,`RewriteRule`指令是非常强大的工具之一,主要用于URL重写,实现URL的美化(如伪静态页面)等功能。本文将深入解析`RewriteRule`的工作原理及其常见用法,并通过具体示例进行说明。 #### 一...

    Apache Rewrite Module 的重定向问题

    ### Apache Rewrite Module 重定向问题解析 #### 一、Apache Rewrite Module 概述 Apache的Rewrite Module(重写模块)是Apache服务器中一个非常强大的工具,主要用于URL重写及重定向功能。它通过一系列规则对请求...

    Apache重写与正则表达式经验总结

    Apache重写是Web服务器Apache的一项强大功能,它允许我们通过RewriteRule指令来改变URL的结构,从而实现URL隐藏、动态URL静态化、路径映射等目的。这在优化网站SEO、提高用户体验以及管理复杂应用架构时尤为重要。...

    apache rewrite rule

    Apache Rewrite Rule是Apache服务器中的一种功能,用于URL重写,它是Apache HTTP服务器的mod_rewrite模块的核心功能。这个功能使得Web服务器能够根据预定义的规则,将用户请求的URL转换为另一种形式,通常是为了优化...

    配置虚拟主机,伪静态,有利于seo

    1. **Apache配置方法**: - 在`httpd.conf`文件中启用`NameVirtualHost`和`VirtualHost`支持。 - 编辑`httpd-vhosts.conf`文件,添加虚拟主机的配置信息。例如: ```apache *:80&gt; ServerAdmin webmaster@...

    Apache之Rewrite和RewriteRule规则梳理以及http强转https的配置总结(完整版)

    本篇文章详细介绍了Apache之Rewrite和RewriteRule规则以及http强转https的配置总结,可作为平时运维手册.特此分享,希望能帮助到有用到的朋友!

    关于Apache_mod_rewite的中文配置和RewriteRule规则详细介绍

    关于Apache_mod_rewrite的中文配置与RewriteRule规则详细介绍 在当今互联网时代,网站优化与安全性是网站管理员关注的焦点。Apache_mod_rewrite作为一个强大的工具,它不仅能够帮助网站优化URL结构,提升用户体验,...

    apache_rewrite_tester:为你的 apache 重写规则编写单元测试,brah

    apache_rewrite_tester 为您的 Apache 重写规则编写单元测试,呵呵。 这显然只是一个徒劳的练习,但它恰好是一个非常有教育意义的徒劳练习。 不要指望这与 Apache 的任何特质相匹配。

    使用apache模块rewrite_module (转)

    ### 使用Apache模块rewrite_module #### 概述 `mod_rewrite`是Apache服务器中的一个重要模块,主要用于URL重写,包括URL的格式变换、请求转发、URL重定向等操作。通过使用`mod_rewrite`,网站管理员可以实现更为...

    apache将不带www域名301重定向到带www的域名的配置方法

    Apache是一款广泛使用的Web服务器软件,支持通过`.htaccess`文件进行重定向配置。下面详细介绍如何使用Apache的`.htaccess`文件实现从不带`www`前缀的域名重定向到带`www`前缀的域名。 ##### 配置步骤 1. **启用...

    13个实用的Apache Rewrite重写规则

    以下是对标题和描述中提到的13个实用的Apache Rewrite重写规则的详细解释: 1. **去除www前缀**:这个规则用于将URL中的 "www" 前缀去掉,统一域名格式。当HTTP_HOST不等于 `jb51.net` 时,规则将URL重定向至无 ...

    浅谈apache和nginx的rewrite的区别

    Apache的rewrite规则使用`RewriteRule`和`RewriteCond`指令,前者用于定义URL重写规则,后者用于根据条件判断是否执行重写。比如,`RewriteRule`指令可以通过正则表达式来匹配URL,并且可以将匹配到的结果重定向到新...

    Linux apache环境多域名配置

    # RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [R,L] ``` - 替换`ServerName`中的`www.test.com`为你想要绑定的域名。 - 替换`DocumentRoot`中的路径为你项目的根目录。 - 可以根据需要开启重写引擎并配置...

    Apache配置中文版

    `mod_rewrite`模块提供强大的URL重写功能,通过`.htaccess`文件或主配置文件中的`RewriteEngine`、`RewriteRule`等指令,可以实现URL美化、隐藏参数、路由转发等。 7. **SSL/TLS安全配置**: 要启用HTTPS,需要...

    解析 .htaccess 文件 apache rewrite

    `.htaccess` 文件是Apache web服务器中的一个配置文件,它允许用户在网站根目录下进行局部配置,以实现一些高级功能,如URL重写、防盗链控制等。这个文件的全称是“分布式配置文件”,即分散在各个目录下的配置文件...

    Apache WebSphere服务器部署方案

    - **RewriteRule 配置问题**:仔细检查RewriteRule语法,确保正确无误。 #### 六、总结 通过本指南,您可以了解到在Linux环境下部署Apache Web Server和IBM WebSphere Application Server的整体流程。从系统安装到...

Global site tag (gtag.js) - Google Analytics