本站所有内容仅限用于学习和研究目的,如有侵权请邮件与我们联系处理!
世上事本无难易,为之则易!

网站首页 站群教程 站群优化教程 正文

在Apache环境下如何写RewriteCond规则伪静态?

曹操 2022-06-20 站群优化教程 670 ℃ 0 评论 8898字 free 收藏

很多做泛目录的朋友在服务器中不仅使用Nginx环境,有时还会因为需要使用Apache环境。

在我们曹操SEO网站中绝大部分泛目录程序只提供了Nginx环境下的伪静态规则,这个时候学会自己编写Apache环境下的伪静态规则就显得很有必要,可惜的是很多朋友不会编写。

花20分钟看完本文,相信您会有很大的收获!

一、Rewrite规则简介

Rewirte主要的功能就是实现URL的跳转,它的正则表达式是基于Perl语言。

可基于服务器级的(httpd.conf)和目录级的 (.htaccess)两种方式。

如果要想用到rewrite模块,必须先安装或加载rewrite模块。

方法有两种一种是编译apache的时候就直接安装rewrite模块,别一种是编译apache时以DSO模式安装apache,然后再利用源码和apxs来安装rewrite模块。

二、在Apache配置中启用Rewrite

打开配置文件httpd.conf:

1.启用rewrite

# LoadModule rewrite_module modules/mod_rewrite.so 去除前面的 #

2.启用.htaccess

在虚拟机配置项中AllowOverride None修改为: AllowOverride All

Rewrite基本写法:服务器有配置文件不可能由我们来改,所以大多情况下要在网站的根目录下建一个.htaccess文件

RewriteEngine on    //启动rewrite引擎
RewriteRule ^/index([0-9]*).HTML$ /index.PHP?id=$1   //“([0-9]*)” 代表范围 用(.*)代表所有,下同。
RewriteRule ^/index([0-9]*)/$ /index.php?id=$1 [R]   //虚拟目录

三、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) 传递给下一个处理

RewriteCond就像我们程序中的if语句一样,表示如果符合某个或某几个条件则执行RewriteCond下面紧邻的RewriteRule语句,这就是RewriteCond最原始、基础的功能,为了方便理解,下面来看看几个例子:

RewriteEngine on
RewriteCond  %{HTTP_USER_AGENT}  ^Mozilla//5/.0.*
RewriteRule  index.php            index.m.php
RewriteCond  %{HTTP_USER_AGENT}  ^Lynx.*
RewriteRule  index.php            index.L.php 
RewriteRule  index.php            index.b.php

上面语句的作用是当你是用FF浏览器访问index.php这个文件的时候,会自动让你访问到index.m.php这个文件,当你是用一些移动终端访问的时候,会让你对index.php这个文件的访问实际访问的是index.L.php去,

如果你是用其它的浏览器访问的时候,会让你跳到 index.b.php。

说形象一点,上面的语句就等同于程序里面的下面语句,依PHP语句为例:

例子一:

if($_SERVER['HTTP_USER_AGENT'] == 'Mozilla/5.0')
{
//跳转到对index.m.php的访问
}
else if($_SERVER['HTTP_USER_AGENT'] == 'Lynx')
{
//跳转到对index.L.php的访问
}
else

//跳转到对index.b.php的访问

例子二:

请注意下列规则是我们做泛目录常需要用到的规则,我们一般跳转到404.php。

RewriteCond %{HTTP_REFERER} (www.test.cn)
RewriteRule (.*)$ test.php

上面语句的作用是如果你访问的上一个页面的主机地址是www.test.cn,则无论你当前访问的是哪个页面,都会跳转到对test.php的访问。

例子三:

RewriteCond %{REMOTE_HOST} ^host1.* [OR]
RewriteCond %{REMOTE_HOST} ^host2.* [OR]
RewriteCond %{REMOTE_HOST} ^host3.*
RewriteRule (.*)$ test.php

上面语句的作用是如果你的地址是host1或host2或host3的时候,则就跳到对test.php。

从这里可以看出,RewriteCond语句之间默认的是AND,如果想要OR,则要明确的写出来。

下面是自己收藏的一些有用的重写规则:

RewriteCond %{REQUEST_FILENAME} !-f   //如果文件存在,就直接访问文件,不进行下面的RewriteRule.(不是文件或文件不存在就执行重写)
RewriteCond %{REQUEST_FILENAME} !-d   //#如果目录存在就直接访问目录不进行RewriteRule
RewriteCond %{REQUEST_URI} !^.*(/.CSS|/.js|/.gif|/.png|/.jpg|/.jpeg)$ //#如果是这些后缀的文件,就直接访问文件,不进行Rewrite

下面列举13个实用的Apache Rewrite重写规则:

例子一:

1.去掉域名中的www标记

RewriteCond %{HTTP_HOST} !^jb51\.net$ [NC]
RewriteRule .? http://baidu.com%{REQUEST_URI} [R=301,L]

例子二:

2.去掉www标记,但是保存子域名

RewriteCond %{HTTP_HOST} ^www\.(([a-z0-9_]+\.)?baidu\.com)$ [NC]
RewriteRule .? http://%1%{REQUEST_URI} [R=301,L]

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

例子三:

3.给子域名加www标记

RewriteCond %{HTTP_HOST} ^([a-z.]+)?jb51\.net$ [NC]
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule .? http://www.%1baidu.com%{REQUEST_URI} [R=301,L]

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

例子四:

4.防止图片盗链

一些站长不择手段的将你的图片盗链在他们网站上,耗费你的带宽,你可以加一下代码阻止这种行为。

RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://(www\.)?jb51\.net/ [NC]
RewriteRule \.(gif|jpg|png)$ – [F]

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

如果对这种盗链你是坚决鄙视的,你还可以改变图片,让访问盗链网站的用户知道该网站正在盗用你的图片。

RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://(www\.)?jb51\.net/.*$ [NC]
RewriteRule \.(gif|jpg|png)$ 你的图片地址 [R=301,L]

除了阻止图片盗链链接,以上规则将其盗链的图片全部替换成了你设置的图片。

你还可以阻止特定域名盗链你的图片:

RewriteCond %{HTTP_REFERER} !^http://(www\.)?leech_site\.net/ [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.baidu.com/index.php?id=nnnn,不包含marker,所以被第一个规则永久重定向到http://www.baidu.com/nnnn。

第二个规则将http://www.baidu.com/nnnn反定向到http://www.baidu.com/index.php?marker&id=nnnn,并且加了marker以及id=nnnn两个变量,最后mod_rewrite就开始进行处理过程。

第二次匹配,marker被匹配,所以忽略第一条规则,这里有一个“.”字符会出现在http://www.baidu.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.baidu.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.baidu.com/$1 [R=301,L]

例子十三:

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

遇到同一个服务器根目录下分别有一个安全服务域名和一个非安全服务域名,所以你就需要用RewriteCond来判断安全服务端口是否占用,并且只将以下列表的页面要求为安全服务:

RewriteCond %{SERVER_PORT} !^443$
RewriteRule ^/?(page1|page2|page3|page4|page5)$ https://www.baidu.com/%1[R=301,L]

以下是怎样将没有设置成安全服务的页面返回到80端口:

RewriteCond %{ SERVER_PORT } ^443$
RewriteRule !^/?(page6|page7|page8|page9)$http://www.baidu.com%{REQUEST_URI} [R=301,L]

其实Rewrite里运用最多的还应该是正则表达式,如果了解点儿正则的话,写起这个规则还是比较简单的。

目录导航
  • 一、Rewrite规则简介
  • 二、在Apache配置中启用Rewrite
  • 三、Apache mod_rewrite规则重写的标志一览
      • 例子一:
      • 例子二:
      • 例子三:
      • 例子一:
      • 例子二:
      • 例子三:
      • 例子四:
      • 例子五:
      • 例子六:
      • 例子七:
      • 例子八:
      • 例子九:
      • 例子十:
      • 例子十一:
      • 例子十二:
      • 例子十三:

  • Tags:二级域名服务器搜索引擎域名

    必看说明

    • 本站中所有被研究的素材与信息全部来源于互联网,版权争议与本站无关。
    • 本站文章或仅为文本内容原创,非程序原创。如有侵权、不妥之处,请联系站长第一时间删除。敬请谅解!
    • 本站所有内容严格遵守国家法律的条例,所有研究的算法技术均来源于搜索引擎公开默认允许用户研究使用的接口。
    • 阅读本文及获取资源前,请确保您已充分阅读并理解《访问曹操SEO网站需知:行为准则》。
    • 本站分享的任何工具、程序仅供学习参考编写架构,仅可在本地的虚拟机内断网测试,严禁联网运行或上传搭建!
    • 任何资源必须在下载后24个小时内,从电脑中彻底删除。不得传播或者用于其他任何用途!否则一切后果用户自负!
    • 转载请注明 : 文章转载自  曹操SEO 在Apache环境下如何写RewriteCond规则伪静态?
    • 本文标题:《在Apache环境下如何写RewriteCond规则伪静态?》
    • 本文链接:https://www.ccooc.cn/34.html

    本文暂时没有评论,来添加一个吧(●'◡'●)

    欢迎 发表评论:

    网站分类
    近期评论
    文章归档
    标签列表
    站点信息
    • 文章总数:2017
    • 页面总数:7
    • 分类总数:46
    • 标签总数:339
    • 评论总数:8850
    • 浏览总数:5142710