`

Apache的rewrite做URL重写

 
阅读更多

本文主要介绍Apache环境下,如何使用mod_rewrite模块完成URL重写功能。

开启mod_rewrite模块

使用URL重写功能,需要安装mod_rewrite模块。使用phpinfo()函数,找到Apache Modules section部分,可以看到当前apache加载模块。

如果没有开启mod_rewrite, 就需要配置mod_rewrite.so的路径:

LoadModule rewrite_module modules/mod_rewrite.so

打开http.conf,一般只要去掉之前的#号即可,重启Apache服务(所有对http.conf做的操作都需要对Apache进行重启)

Apache2内置了mod_rewirte,在配置虚拟主机的配置文件VirtualHost部分打开引擎:RewriteEngine on

这句之后就可以使用重写语法了。

VirtualHost文件部分的Directory配置必须是:

<Directory />

Options Includes FollowSymLinks #允许使用符号链接

AllowOverride All #允许目录配置文件.htaccess。如果不使用是AllowOverride None

</ Directory>

利用mod_rewrite重写URL主要使用两个基本的指令RewriteRule和RewriteCond。

 

RewriteRule指令

RewriteRule Pattern Substitution [Flags]

在模式(Pattern)和替换(Substitution)中使用正则表达式来匹配相应的字符。

譬如有如下的URL:

http://www.example.com/display.php?country=USA &state=California&city=San_Diego

REQUEST_URI的值是“/country=USA &state=California&city=San_Diego”,要将国家州城市信息更友好的显示给用,要显示成这样:

http://www.example.com/USA/California/San_Diego

一个最常用的正则就是(.*)。它含有两个元素:一是“点”,表示任 意字符;二是“星”,表示以前的全部字符。所以(.*)会匹配{REQUEST_URI}的所有字符。Rewrite重写引擎的输入串是{REQUEST_URI},也就是URL中出去域名以及“?”符号后的所有查询字符。

重定向的URL中要提取出“USA/California/San_Diego”,匹配模式正则表达式的原型是:

(.*)/(.*)/(.*)

以上正则,在{REQUEST_URI}中通过两个“/”的分割存储了三个值,为了解决我们具体问题,我们得加一点限制――毕竟,第一个和最后一个原子可以匹配任何字符。

开始,我们可以添加一些特殊的字符,比如表示正则“开始”或者“结束”,“^”字符表示正则的开始而“$”表示正则的结束。

^(.*)/(.*)/(.*)$

{REQUEST_URI}是以“/”开头。Apache 在更改版本的时候会更改正则引擎,一代Apache要求有斜杠而二代Apache却不允许!但是我们可以用^/?(?表示匹配字符本身或者前一个字符)来兼容两个版本的Apache。再加上对字符匹配的限制,最终匹配模式是:

^/?([a-zA-Z_]+)/([a-zA-Z_]+)/([a-zA-Z_]+)$

完整表示如下:

RewriteEngine on

RewriteRule ^/?([a-zA-Z_]+)/([a-zA-Z_]+)/([a-zA-Z_]+)$ display.php?country=$1 &state=$2&city=$3 [L]

RewriteRule使用$1到$9引用模式()中匹配的内容,称为反向引用。对于URL:

http://www.example.com/USA/California/San_Diego

$1=USA,$2=California,$3=San_Diego

 

RewriteRule选项

"redirect|R[=code]" 强制重定向。经常引用到触发可见的定向。默认情况下它是一个HTTP 302的临时重定向,但是你可以注明具体的HTTP 代码,比如你可以用[R=301]来表明这是一个永久重定向,这对搜索引擎抓取你重定向后的网页相当有用。

"proxy|P"   强制为代理

"forbidden|F"   403 禁止。告诉Apache响应请求时不提供页面。其原理就是Apache会发出一个403 HTTP相应,可以保护网站不被未经授权的或者其他盗链访问。

"nocase|NC" 忽略正则表达式中的大小写。它经常被用到{HTTP_HOST}服务器参数上,因为域名里面是不会区分大小写的。

"next|N"    回到第一条规则。可以让你的重写条件循环匹配,当你不知道{REQUEST_URI}有多少字符进行匹配的时候很有用。

"last|L"    最后一个规则。告诉Apache服务器一系列的条件或者是规则将在它出现后结束,换句话说就是[L]不出现,mod_rewrite将会一直执行。

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

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

可以使‘/foo/zed’转向到一个安全的请求‘/bar?arg=P1=zed’.

"skip|S=N" 跳过下面的N条规则。

 

RewriteCond指令

RewriteCond TestString CondPattern [Flags]

RewriteCond指令定义了一个规则的条件,即在一个RewriteRule指令之前有一个或多个RewriteCond指令。 条件之后的重写规则仅在当前URI与pattern匹配并且符合这些条件的时候才会起作用。

RewriteCond也有反向引用,但和RewriteRule中用$N引用不同,它使用%N反向引用。

RewriteCond引用Apache变量%{ NAME_OF_VARIABLE},如%{HTTP_HOST}。

RewriteCond的条件模式(CondPattern)除了使用perl样式正则表达式,还有额外的规则:

1.  使用‘!’ 字符(惊叹号)来实现匹配的反转

2. ‘<CondPattern’ (词典顺序的小于)。将CondPattern视为纯字符串,与TestString以词典顺序相比较. 如果按词典顺序,TestString小于CondPattern,则为真。类似还有>,=。

3. ‘-d’ (是一个目录[directory])。将TestString视为一个路径名并测试它是否存在而且是一个目录.

4. ‘-f’ (是一个常规的文件[file])。将TestString视为一个路径名并测试它是否存在而且是一个常规的文件.

5. ‘-s’ (是一个非空的常规文件[size])。将TestString视为一个路径名并测试它是否存在而且是一个尺寸大于0的常规的文件.

6.‘-l’ (是一个符号连接[link])。将TestString视为一个路径名并测试它是否存在而且是一个符号连接.

7.‘-F’ (对子请求有效的业已存在的文件)。测试TestString是否一个有效的文件, 而且可以被服务器当前已经配置的所有存取控制所存取。 它用一个内部子请求来做判断,由于会降低服务器的性能,请小心使用!

 

RewriteCond选项

‘nocase|NC’ (no case)。它使测试忽略大小写。此标记仅作用于TestString和CondPattern的比较, 而对文件系统和子请求的测试不起作用。

‘ornext|OR’ (or next condition)。它以OR方式组合若干规则的条件,而不是默认的AND。典型的例子如下:

RewriteCond %{REMOTE_HOST} ^host1.* [OR]

RewriteCond %{REMOTE_HOST} ^host2.* [OR]

RewriteCond %{REMOTE_HOST} ^host3.*

RewriteRule …some special stuff for any of these hosts…

如果不用这个标记,则必须使用三个 条件/规则。

 

服务器变量

HTTP变量

HTTP_USER_AGENT, HTTP_REFERER, HTTP_COOKIE,

HTTP_FORWARDED, HTTP_HOST, HTTP_PROXY_CONNECTION, HTTP_ACCEPT

连结和请求的变量

REMOTE_ADDR, REMOTE_HOST, REMOTE_USER, REMOTE_IDENT,

REQUEST_METHOD, SCRIPT_FILENAME, PATH_INFO, QUERY_STRING, AUTH_TYPE

服务器内部变量

DOCUMENT_ROOT, SERVER_ADMIN, SERVER_NAME, SERVER_ADDR,

SERVER_PORT, SERVER_PROTOCOL, SERVER_SOFTWARE

系统变量

TIME_YEAR, TIME_MON, TIME_DAY, TIME_HOUR,

TIME_MIN, TIME_SEC, TIME_WDAY, TIME

mod_rewrite特殊值

API_VERSION, THE_REQUEST, REQUEST_URI, REQUEST_FILENAME

 

URL重写举例

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)$ http://www.example.com/hotlinked.gif [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页面

RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-f

RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-d

RewriteRule .? /404.php [L]

-f匹配的是存在的文件名,-d匹配的存在的路径名

 

6.创建无文件后缀名链接

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为后缀,这条规则将被执行。

 

7.强制使用HTTPS

RewriteCond %{HTTPS} !on

#RewriteCond %{SERVER_PORT} !^443$

RewriteCond %{HTTP_HOST} ^([a-z.]+)?example\.com$ [NC]

RewriteRule ^(.*)$  https://xample.com$1 [R=301,L]

判断HTTPS服务可以判断安全端口(一般是443),也可以通过HTTPS变量。将example.com域名下所有url都强制使用https服务。

如果不判断域名,可以这样:

RewriteCond %{HTTPS} !on

RewriteRule ^/?(.*)$  https://%{SERVER_NAME}/$1 [R=301,L]

这里的$1前面有斜杠/,其实是匹配模式去掉了斜杠的原因,和上面效果是一样的
分享到:
评论

相关推荐

    UrlReWrite(Url重写或伪静态)完美示例源码

    URL重写技术在今天已不是什么新鲜的话题了,在Apache服务器提供了名为mod_rewrite的URL重写模块,而在IIS服务器上,也有很多商业的ISAPI 筛选器模块可供使用。然而这对于我们,没有很多的资金或使用的共享服务器,...

    urlrewrite url地址重写

    - **Apache mod_rewrite**:Apache服务器的模块,通过配置.htaccess文件实现URL重写。 - **UrlRewriteFilter**:这是一个基于Java的开源过滤器,常用于Spring MVC等Java Web应用中,通过web.xml配置实现URL重写。 ...

    UrlReWrite(Url重写或伪静态)

    UrlRewrite通常通过编写规则文件来实现URL重写,如IIS的web.config或Apache的.htaccess。规则通常包含正则表达式,用于匹配和转换URL。以下是一个简单的示例: ```xml &lt;match url="^article/([0-9]+)/(.*)$" /&gt; ...

    ISAPI_Rewrite 3.0 URL重写规则

    ISAPI_Rewrite 3.0 是一款强大的URL重写工具,主要针对使用IIS(Internet Information Services)服务器的用户。这款插件由Helicon Tech公司开发,它模仿了Apache服务器上的mod_rewrite模块,使IIS也能实现灵活的URL...

    urlrewrite重写URL伪静态请求路径.

    标题 "urlrewrite重写URL伪静态请求路径" 涉及到的是Web开发中的一个重要概念——URL重写,这是为了优化网站的SEO(搜索引擎优化)和用户体验而进行的一种技术手段。URL重写允许我们将复杂的动态URL转换为简洁、易于...

    Apache Rewrite Module 的重定向问题

    Apache的Rewrite Module(重写模块)是Apache服务器中一个非常强大的工具,主要用于URL重写及重定向功能。它通过一系列规则对请求进行处理,实现动态地改变请求路径,从而达到优化网站结构、改善用户体验的目的。 ...

    商业编程-源码-UrlReWrite(Url重写或伪静态)完美示例源码.zip

    **URL重写(UrlRewrite)** URL重写是Web服务器技术的一部分,它允许将动态URL转换为更友好的、静态化的形式。在SEO(搜索引擎优化)中,静态化的URL通常比动态URL更有优势,因为它们更容易被搜索引擎理解和索引。...

    apache_rewrite语法

    apache_rewrite语法的详细解析,实现php的URL重写。

    IIS Urlrewrite2

    1. **安装**:下载并安装IIS URL重写2的扩展,通常是`IIS Urlrewrite2.exe`文件,通过IIS Manager进行安装。 2. **添加规则**:在IIS Manager中选择目标站点,然后在“管理服务”下找到“URL重写”,点击“添加规则...

    Apache的URL重写规则的标志详细说明

    以下是对Apache URL重写规则中一些常用标志的详细说明: 1. **R[=code]**: 强制外部重定向。此标志会在替代字符串前添加主机名和端口号,形成完整的外部URL,并使用指定的HTTP状态码进行重定向。默认情况下,状态码...

    urlrewrite重写demo

    `URLRewrite`是Apache的开源项目Tuckey提供的一种URL重写工具,它可以在不改变实际URL的情况下,对URL进行重定向或者转换,使得URL更加简洁、友好。本篇文章将深入探讨`URLRewrite`的工作原理以及如何实现伪静态技术...

    CI Nginx IIS Apache URL重写

    本主题聚焦于CI(CodeIgniter)框架在与Nginx、IIS(Internet Information Services)和Apache这三种不同的Web服务器配合时的URL重写实践。下面我们将深入探讨这些服务器的URL重写机制以及如何在CI框架中实现。 ...

    URL重写(UrlReWrite)

    URL重写技术在今天已不是什么新鲜的话题了,在Apache服务器提供了名为mod_rewrite的URL重写模块,而在IIS服务器上,也有很多商业的ISAPI 筛选器模块可供使用。然而这对于我们,没有很多的资金或使用的共享服务器,...

    URL重写的一个例子

    1. **服务器配置**:大多数Web服务器(如Apache、IIS)都支持URL重写模块,通过配置规则文件(如Apache的`.htaccess`或IIS的`web.config`)来实现URL转换。 2. **框架内置支持**:许多Web框架(如ASP.NET MVC、Ruby...

    Apache rewrite重写规则的常见应用

    为了让客户不会因此受到任何影响,最好的方法就是使用Apache Rewrite Rule(重写规则)。  二、重写规则的作用范围  —- 1.使用在Apache主配置文件httpd.conf中。  —- 2.使用在httpd.conf里定义的配置中。 ...

    urlrewrite地址重写实例配置说明

    URLRewrite通常与Apache的mod_rewrite或者在Java Web应用中的Tuckey's URLRewriteFilter一起使用。以下将详细介绍URLRewrite的工作原理和实例配置。 **1. URLRewrite工作原理** URLRewrite基于HTTP请求的过程,...

    Apache Rewrite url重定向功能的简单配置

    1.Apache Rewrite的主要功能 就是实现URL的跳转和隐藏真实地址,基于Perl语言的正则表达式规范。平时帮助我们实现拟静态,拟目录,域名跳转,防止盗链等 2.Apache Rewrite的配置 Apache下的Rewrite配置主要有两种,...

Global site tag (gtag.js) - Google Analytics