如何在Apache环境下配置Rewrite规则

归类于网站建设知识 | 参与评论

URL 静态化是一个利于搜索引擎的设置,通过 URL 静态化,达到原来是动态的 PHP 页面转换为静态化的 HTML 页面,当然,这里的静态化是一种假静态,目的只是提高搜索引擎的搜索量,Comsenz 旗下的产品 Discuz!、SupeSite/X-Space、ECShop、SupeV、UCHome 等都支持此功能。当然这个功能还需要服务器环境的支持,下面介绍一下如何在 Apache 服务器下配置 URL 静态化的 Rewrite 规则。

当然这里分两种情况,一种是独立主机用户,这部分用户拥有对主机的管理权限,因此配置起来比较方便一些。(注:这里就以 Discuz!6.1.0 的 Rewrite 规则为例,稍后在后面会列举出其他产品的 Rewrite 规则。

首先确定您使用的 Apache 版本,及是否加载了 mod_Rewrite 模块。

Apache 1.x 的用户请检查 conf/httpd.conf 中是否存在如下两段代码:

LoadModule Rewrite_module libexec/mod_Rewrite.so AddModule mod_Rewrite.c

Apache 2.x 的用户请检查 conf/httpd.conf 中是否存在如下一段代码:

LoadModule Rewrite_module modules/mod_Rewrite.so

如果存在,那么在配置文件(通常就是 conf/httpd.conf)中加入如下代码。此时请务必注意,如果网站使用通过虚拟主机来定义,请务必加到虚拟主机配置,即 <VirtualHost> 中去,如果加在虚拟主机配置外部将可能无法使用,改好后将 Apache 重启。

<IfModule mod_Rewrite.c> RewriteEngine On RewriteRule ^(.*)/archiver/((fid|tid)-[\w\-]+\.html)$ $1/archiver/index.php?$2 RewriteRule ^(.*)/forum-([0-9]+)-([0-9]+)\.html$ $1/forumdisplay.php?fid=$2&page=$3 RewriteRule ^(.*)/thread-([0-9]+)-([0-9]+)-([0-9]+)\.html$ $1/viewthread.php?tid=$2&extra=page\%3D$4&page=$3 RewriteRule ^(.*)/space-(username|uid)-(.+)\.html$ $1/space.php?$2=$3 RewriteRule ^(.*)/tag-(.+)\.html$ $1/tag.php?name=$2 </IfModule>

如果没有安装 mod_Rewrite,您可以重新编译 Apache,并在原有 configure 的内容中加入 –enable-Rewrite=shared,然后再在 Apache 配置文件中加入上述代码即可。

另外一种用户是 Apache 虚拟主机用户。

在开始以下设置之前,请首先咨询您的空间服务商,空间是否支持 Rewrite 以及是否支持对站点目录中 .htaccess 的文件解析,否则即便按照下面的方法设置好了,也无法使用。

检查论坛所在目录中是否存在 .htaccess 文件,如果不存在,请手工建立此文件。Win32 系统下,无法直接建立 .htaccess 文件,您可以从其他系统中拷贝一份,或者在 Discuz.net 技术支持栏目中下载此文件。编辑并修改 .htaccess 文件,添加以下内容:

# 将 RewriteEngine 模式打开 RewriteEngine On # 修改以下语句中的 /discuz 为你的论坛目录地址,如果程序放在根目录中,请将 /discuz 修改为 / RewriteBase /discuz # Rewrite 系统规则请勿修改 RewriteRule ^archiver/((fid|tid)-[\w\-]+\.html)$ archiver/index.php?$1 RewriteRule ^forum-([0-9]+)-([0-9]+)\.html$ forumdisplay.php?fid=$1&page=$2 RewriteRule ^thread-([0-9]+)-([0-9]+)-([0-9]+)\.html$ viewthread.php?tid=$1&extra=page\%3D$3&page=$2 RewriteRule ^space-(username|uid)-(.+)\.html$ space.php?$1=$2 RewriteRule ^tag-(.+)\.html$ tag.php?name=$1

添加内容时,请遵照上面的提示,修改论坛所在的路径,然后保存。将 .htaccess 文件上传到论坛所在的目录中。然后进入论坛系统设置的搜索引擎优化,根据需要开启 URL 静态化功能。

下面简单介绍一些其他产品的 Rewrite 规则。

SupeSite/X-Space6.0 UC规则

Apache 独立主机用户:

<IfModule mod_Rewrite.c> RewriteEngine On
###Rewrite 系统规则请勿修改
RewriteRule ^/([0-9]+)/spacelist(.+)$ /index.php?uid/$1/action/spacelist/type$2 [L]
RewriteRule ^/([0-9]+)/viewspace(.+)$ /index.php?uid/$1/action/viewspace/itemid$2 [L]
RewriteRule ^/([0-9]+)/viewbbs(.+)$ /index.php?uid/$1/action/viewbbs/tid$2 [L]
RewriteRule ^/([0-9]+)/(.*)$ /index.php?uid/$1/$2 [L]
RewriteRule ^/([0-9]+)$ /index.php?uid/$1 [L]
RewriteRule ^/action(.+)$ /index.php?action$1 [L]
RewriteRule ^/category(.+)$ /index.php?action/category/catid$1 [L]
RewriteRule ^/viewnews(.+)$ /index.php?action/viewnews/itemid$1 [L]
RewriteRule ^/viewthread(.+)$ /index.php?action/viewthread/tid$1 [L]
RewriteRule ^/mygroup(.+)$ /index.php?action/mygroup/gid$1 [L]
</IfModule>

Apache 虚拟主机用户:

### 将 RewriteEngine 模式打开 RewriteEngine On                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            

ECShop2.6.0 规则

Apache 独立主机用户:

<IfModule mod_Rewrite.c> RewriteEngine On RewriteRule ^(.*)/index.html$ $1/index.php RewriteRule ^(.*)/category$ $1/index.php [L] RewriteRule ^(.*)/feed-c([0-9]+).xml$ $1/feed.php?cat=$2 [L] RewriteRule ^(.*)/feed-b([0-9]+).xml$ $1/feed.php?brand=$2 [L] RewriteRule ^(.*)/feed.xml$ $1/feed.php RewriteRule ^(.*)/category-([0-9]+)-b([0-9]+)-min([0-9]+)-max([0-9]+)-attr([^-]*)-([0-9]+)-(.+)-([a-zA-Z]+)(.*)\.html$ $1/category.php?id=$2&brand=$3&price_min=$4&price_max=$5&filter_attr=$6&page=$7&sort=$8&order=$9 RewriteRule ^(.*)/category-([0-9]+)-b([0-9]+)-min([0-9]+)-max([0-9]+)-attr([^-]*)\.html$ $1/category.php?id=$2&brand=$3&price_min=$4&price_max=$5&filter_attr=$6 RewriteRule ^(.*)/category-([0-9]+)-b([0-9]+)-([0-9]+)-(.+)-([a-zA-Z]+)(.*)\.html$ $1/category.php?id=$2&brand=$3&page=$4&sort=$5&order=$6 RewriteRule ^(.*)/category-([0-9]+)-b([0-9]+)-([0-9]+)(.*)\.html$ $1/category.php?id=$2&brand=$3&page=$4 RewriteRule ^(.*)/category-([0-9]+)-b([0-9]+)(.*)\.html$ $1/category.php?id=$2&brand=$3 RewriteRule ^(.*)/category-([0-9]+)(.*)\.html$ $1/category.php?id=$2 RewriteRule ^(.*)/goods-([0-9]+)(.*)\.html$ $1/goods.php?id=$2
RewriteRule ^(.*)/article_cat-([0-9]+)-([0-9]+)-(.+)-([a-zA-Z]+)(.*)\.html$ $1/article_cat.php?id=$2&page=$3&sort=$4&order=$5
RewriteRule ^(.*)/article_cat-([0-9]+)-([0-9]+)(.*)\.html$ $1/article_cat.php?id=$2&page=$3
RewriteRule ^(.*)/article_cat-([0-9]+)(.*)\.html$ $1/article_cat.php?id=$2
RewriteRule ^(.*)/article-([0-9]+)(.*)\.html$ $1/article.php?id=$2
RewriteRule ^(.*)/brand-([0-9]+)-c([0-9]+)-([0-9]+)-(.+)-([a-zA-Z]+)\.html $1/brand.php?id=$2&cat=$3&page=$4&sort=$5&order=$6
RewriteRule ^(.*)/brand-([0-9]+)-c([0-9]+)-([0-9]+)(.*)\.html $1/brand.php?id=$2&cat=$3&page=$4
RewriteRule ^(.*)/brand-([0-9]+)-c([0-9]+)(.*)\.html $1/brand.php?id=$2&cat=$3
RewriteRule ^(.*)/brand-([0-9]+)(.*)\.html $1/brand.php?id=$2
RewriteRule ^(.*)/tag-(.*)\.html $1/search.php?keywords=$2
RewriteRule ^(.*)/snatch-([0-9])\.html$ $1/snatch.php?id=$2
RewriteRule ^(.*)/group_buy-([0-9])\.html$ $1/group_buy.php?act=view&id=$2
</IfModule>

Apache 虚拟主机用户:

RewriteEngine On #RewriteBase / # direct one-word access RewriteRule ^index\.html$ index\.php [L] RewriteRule ^category$ index\.php [L] # access any object by its numeric identifier RewriteRule ^feed-c([0-9]+)\.xml$ feed\.php\?cat=$1 [L] RewriteRule ^feed-b([0-9]+)\.xml$ feed\.php\?brand=$1 [L] RewriteRule ^feed\.xml$ feed\.php [L] RewriteRule ^category-([0-9]+)-b([0-9]+)-min([0-9]+)-max([0-9]+)-attr([^-]*)-([0-9]+)-(.+)-([a-zA-Z]+)(.*)\.html$ category\.php\?id=$1&brand=$2&price_min=$3&price_max=$4&filter_attr=$5&page=$6&sort=$7&order=$8 [QSA,L]
RewriteRule ^category-([0-9]+)-b([0-9]+)-min([0-9]+)-max([0-9]+)-attr([^-]*)(.*)\.html$ category\.php\?id=$1&brand=$2&price_min=$3&price_max=$4&filter_attr=$5 [QSA,L]
RewriteRule ^category-([0-9]+)-b([0-9]+)-([0-9]+)-(.+)-([a-zA-Z]+)(.*)\.html$ category\.php\?id=$1&brand=$2&page=$3&sort=$4&order=$5 [QSA,L]
RewriteRule ^category-([0-9]+)-b([0-9]+)-([0-9]+)(.*)\.html$ category\.php\?id=$1&brand=$2&page=$3 [QSA,L]
RewriteRule ^category-([0-9]+)-b([0-9]+)(.*)\.html$ category\.php\?id=$1&brand=$2 [QSA,L]
RewriteRule ^category-([0-9]+)(.*)\.html$ category\.php\?id=$1 [QSA,L]
RewriteRule ^goods-([0-9]+)(.*)\.html$ goods\.php\?id=$1 [QSA,L]
RewriteRule ^article_cat-([0-9]+)-([0-9]+)-(.+)-([a-zA-Z]+)(.*)\.html$ article_cat\.php\?id=$1&page=$2&sort=$3&order=$4 [QSA,L]
RewriteRule ^article_cat-([0-9]+)-([0-9]+)(.*)\.html$ article_cat\.php\?id=$1&page=$2 [QSA,L]
RewriteRule ^article_cat-([0-9]+)(.*)\.html$ article_cat\.php\?id=$1 [QSA,L]
RewriteRule ^article-([0-9]+)(.*)\.html$ article\.php\?id=$1 [QSA,L]
RewriteRule ^brand-([0-9]+)-c([0-9]+)-([0-9]+)-(.+)-([a-zA-Z]+)\.html brand\.php\?id=$1&cat=$2&page=$3&sort=$4&order=$5 [QSA,L]
RewriteRule ^brand-([0-9]+)-c([0-9]+)-([0-9]+)(.*)\.html brand\.php\?id=$1&cat=$2&page=$3 [QSA,L]
RewriteRule ^brand-([0-9]+)-c([0-9]+)(.*)\.html brand\.php\?id=$1&cat=$2 [QSA,L]
RewriteRule ^brand-([0-9]+)(.*)\.html brand\.php\?id=$1 [QSA,L]
RewriteRule ^tag-(.*)\.html search\.php\?keywords=$1 [QSA,L]
RewriteRule ^snatch-([0-9]+)\.html$ snatch\.php\?id=$1 [QSA,L]
RewriteRule ^group_buy-([0-9]+)\.html$ group_buy\.php\?act=view&id=$1 [QSA,L]
RewriteRule ^auction-([0-9]+)\.html$ auction\.php\?act=view&id=$1 [QSA,L]

SupeV1.0beta 规则

Apache 独立主机用户:

<IfModule mod_Rewrite.c> RewriteEngine On RewriteRule ^(.*)/ivideo(-tv-([0-9]+))?(-ti-([0-9]+))?(-tc-([0-9]+))?(-page-([0-9]+))?\.html$ $1/ivideo.php?tv=$3&ti=$5&tc=$7&page=$9 RewriteRule ^(.*)/ispecial(-tv-([0-9]+))?(-ti-([0-9]+))?(-tc-([0-9]+))?(-page-([0-9]+))?\.html$ $1/ispecial.php?tv=$3&ti=$5&tc=$7&page=$9 RewriteRule ^(.*)/icategory\.html$ $1/icategory.php RewriteRule ^(.*)/category-cid-([0-9]+)(-tag-([^-]*))?(-timelimit-([0-9]+))?(-orderlimit-([0-9]+))?(-page-([0-9]+))?\.html$ $1/category.php?cid=$2&tag=$4&timelimit=$6&orderlimit=$8&page=$10 RewriteRule ^(.*)/vspace-(mid|username)-(.+)\.html$ $1/vspace.php?$2=$3 RewriteRule ^(.*)/video-(vid|ivid)-(.+)\.html$ $1/video.php?$2=$3 RewriteRule ^(.*)/special-spid-([0-9]+)\.html$ $1/special.php?spid=$2 </IfModule>

Apache 虚拟主机用户:

# 将 RewriteEngine 模式打开 RewriteEngine On # 修改以下语句中的 /SupeV 为你的播客目录地址,如果程序放在根目录中,请将 /SupeV 修改为 / RewriteBase /SupeV # Rewrite 系统规则请勿修改 RewriteRule RewriteRule ^ivideo(-tv-([0-9]+))?(-ti-([0-9]+))?(-tc-([0-9]+))?(-page-([0-9]+))?\.html$ ivideo.php?tv=$2&ti=$4&tc=$6&page=$8 RewriteRule ^ispecial(-tv-([0-9]+))?(-ti-([0-9]+))?(-tc-([0-9]+))?(-page-([0-9]+))?\.html$ ispecial.php?tv=$2&ti=$4&tc=$6&page=$8 RewriteRule ^icategory\.html$ icategory.php RewriteRule ^category-cid-([0-9]+)(-tag-([^-]*))?(-timelimit-([0-9]+))?(-orderlimit-([0-9]+))?(-page-([0-9]+))?\.html$ category.php?cid=$1&tag=$3&timelimit=$5&orderlimit=$7&page=$9 RewriteRule ^vspace-(mid|username)-(.+)\.html$ vspace.php?$1=$2 RewriteRule ^video-(vid|ivid)-(.+)\.html$ video.php?$1=$2 RewriteRule ^special-spid-([0-9]+)\.html$ special.php?spid=$1

UCHome1.0 规则

Apache 独立主机用户:

RewriteEngine On RewriteRule ^/(space|network)\-(.+)\.html$ /$1.php?Rewrite=$2 [L] RewriteRule ^/(space|network)\.html$ /$1.php [L] RewriteRule ^/([0-9]+)$ /space.php?uid=$1 [L]

Apache 虚拟主机用户:

RewriteEngine On RewriteBase / RewriteRule ^(space|network)\-(.+)\.html$ $1.php?Rewrite=$2 [L] RewriteRule ^(space|network)\.html$ $1.php [L] RewriteRule ^([0-9]+)$ space.php?uid=$1 [L]

当然,在我们每个发布的程序包中,都有关于此版本程序对应的 Rewrite 规则,大家可以在那里找到相对应的 Rewrite 规则。

如何在IIS环境下配置Rewrite规则

归类于网站建设知识 | 参与评论

URL 静态化可以提高搜索引擎抓取,开启本功能需要对 Web 服务器增加相应的 Rewrite 规则,且会轻微增加服务器负担。本教程讲解如何在 IIS 环境下配置各个产品的 Rewrite 规则。

一、首先下载 Rewrite.zip 的包,解压到任意盘上的任意目录。

各个产品的 Rewrite 规则包不同,请选择对应的产品下载对应的 Rewrite 规则。

Discuz!6.0.0/6.1.0 的 Rewrite 规则下载地址:Rewrite.zip

UCenter Home1.0.0 的 Rewrite规则下载地址:Rewrite.zip

SupeSite6.0_X-Space4.0_UC 的Rewrite 规则下载地址:iisrewrite.zip

SupeV 的 Rewrite 规则下载地址:rewrite_iis.zip

下载各个产品的 Rewrite 规则并且重命名后如下图所示存放:

二、配置方法

Discuz!、UCHome、SupeSite/X-Space、SupeV 的 Rewrite 配置方法类似,下面以 Discuz!6.0.0/6.1.0 的 Rewrite 规则配置方法为例讲解如何在 IIS 环境下配置 Rewrite 规则。

在 IIS 管理器里选择网站,右键选择“属性”,如下图所示:

在弹出的窗口里选择“ISAPI筛选器”

上图中点击“添加”,在弹出的窗口里“筛选器名称”填写“rewrite”

上图界面中点击“浏览”,选择下载解压后的 Discuz! Rewrite 规则目录下的 Rewrite.dll 文件

浏览完毕点击“确定”

添加完毕点击“确定”

重新启动 IIS

重新选择该站点 => 右键“属性”=> “ISAPI 筛选器”,如果看到状态为向上的绿色箭头,就说明 Rewrite 模块安装成功了。

Rewrite 规则配置成功了,但是这个时候浏览论坛地址依旧不是伪静态的,还需要到论坛后台做相应的设置才可以。

论坛后台 => 全局 => 优化设置,下图中红色区域选项:

“URL 静态化”:如上图所示有五个选项,根据您的需求选择即可,最多可以选择五个,不选则不生效。

“Rewrtie 兼容性”:如果您的服务器不支持 Rewrite 规则中的中文字符,请选择“是”。对于没有此问题的服务器,可以选择“否”。

上面两项设置完毕“提交”保存即可。

这个时候返回到论坛首页随便打开一个版块或者一个帖子即可看到 Discuz! 的 Rewrite 伪静态配置成功!

三、各个产品的 Rewrite 规则

httpd.ini 文件内容如下配置

[ISAPI_Rewrite] # 3600 = 1 hour CacheClockRate 3600 RepeatLimit 32 # Discuz! Rewrite规则 # 独立主机用户 # Protect httpd.ini and httpd.parse.errors files # from accessing through HTTP RewriteRule ^(.*)/archiver/((fid|tid)-[\w\-]+\.html)\?*(.*)$ $1/archiver/index\.php\?$2&$4 RewriteRule ^(.*)/forum-([0-9]+)-([0-9]+)\.html\?*(.*)$ $1/forumdisplay\.php\?fid=$2&page=$3&$4 RewriteRule ^(.*)/thread-([0-9]+)-([0-9]+)-([0-9]+)\.html\?*(.*)$ $1/viewthread\.php\?tid=$2&extra=page\%3D$4&page=$3&$4 RewriteRule ^(.*)/space-(username|uid)-(.+)\.html\?*(.*)$ $1/space\.php\?$2=$3&$4 RewriteRule ^(.*)/tag-(.+)\.html\?*(.*)$ $1/tag\.php\?name=$2&$3 # SupeSite Rewrite规则 # 独立主机用户 # 修改以下语句中的 /supesite 修改为你的SupeSite目录地址,如果程序放在根目录中,请将 /supesite 修改为 / RewriteRule ^/supesite/([0-9]+)$ /supesite/index\.php\?uid/$1 [L] RewriteRule ^/supesite/([0-9]+)/spacelist(.+)$ /supesite/index\.php\?uid/$1/action/spacelist/type$2 [L] RewriteRule ^/supesite/([0-9]+)/viewspace(.+)$ /supesite/index\.php\?uid/$1/action/viewspace/itemid$2 [L] RewriteRule ^/supesite/([0-9]+)/viewbbs(.+)$ /supesite/index\.php\?uid/$1/action/viewbbs/tid$2 [L] RewriteRule ^/supesite/([0-9]+)/(.*)$ /supesite/index\.php\?uid/$1/$2 [L] RewriteRule ^/supesite/action(.+)$ /supesite/index\.php\?action$1 [L] RewriteRule ^/supesite/category(.+)$ /supesite/index\.php\?action/category/catid$1 [L] RewriteRule ^/supesite/viewnews(.+)$ /supesite/index\.php\?action/viewnews/itemid$1 [L] RewriteRule ^/supesite/viewthread(.+)$ /supesite/index\.php\?action/viewthread/tid$1 [L] RewriteRule ^/supesite/mygroup(.+)$ /supesite/index\.php\?action/mygroup/gid$1 [L] # UCHome Rewrite规则 # 独立主机用户 # 修改以下语句中的 /uchome 修改为你的uchome目录地址,如果程序放在根目录中,请将 /uchome 修改为 / RewriteRule ^/uchome/(space|network)-(.+)\.html$ /uchome/$1\.php\?rewrite=$2 [L]              

初级URL重写指南

归类于网站建设知识 | 参与评论

本文是mod_rewrite参考文档的补充材料。阐述在实际应用中如何解决网管所面临的基于URL的典型问题,并详细描述了如何配置URL重写规则集以解决这些问题。

注意:根据你的服务器配置,有可能必须对这里的例子作些小修改,比如,在额外启用mod_alias和mod_userdir的情况下要增加[PT]标志,或者为了适应目录级(.htaccess)的配置而将针对服务器级的规则集进行重写。对一个特定的规则集应该先透彻理解然后再考虑应用,这样才能避免出现问题。

规范化URL
描述:
在有些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]

但是这样一来会增加处理上的开销。

将用户主目录移动到不同web服务器
描述:
通常,许多网管在建立一个新的web服务器时,都会有这样的要求:重定向一个web服务器上的所有用户主目录到另一个web服务器。
解决方案:
很简单,在老的web服务器上重定向所有的"/~user/anypath"到"http://newserver/~user/anypath":
RewriteEngine on
RewriteRule   ^/~(.+)  http://newserver/~$1  [R,L]

在多个目录中搜索页面
描述:
有时会有必要使web服务器在多个目录中搜索页面,对此,MultiViews或者其他技术无能为力。
解决方案:
编制一个明确的规则集以搜索目录中的文件:
RewriteEngine on

# 首先尝试在 dir1 中寻找,找到即停
RewriteCond         /your/docroot/dir1/%{REQUEST_FILENAME}  -f
RewriteRule  ^(.+)  /your/docroot/dir1/$1  [L]

# 然后尝试在 dir2 中寻找,找到即停
RewriteCond         /your/docroot/dir2/%{REQUEST_FILENAME}  -f
RewriteRule  ^(.+)  /your/docroot/dir2/$1  [L]

# 再找不到就继续寻找其他的 Alias 或 ScriptAlias 目录
RewriteRule   ^(.+)  -  [PT]

按照URL的片段设置环境变量
描述:
希望保持请求之间的状态信息,又不希望使用CGI来包装所有页面,只是通过分离URL中的有用信息来做到。
解决方案:
可以用一个规则集来分离出状态信息,并设置环境变量以备此后用于XSSI或CGI。这样,一个"/foo/S=java/bar/"的URL会被解析为"/foo/bar/",而环境变量STATUS则被设置为"java"。
RewriteEngine on
RewriteRule   ^(.*)/S=([^/]+)/(.*)    $1/$3 [E=STATUS:$2]

虚拟用户主机
描述:
如果需要为用户username支持一个www.username.host.domain.com的主页,但不在此机器上建虚拟主机,而是仅用在此机器上增加一个DNS A记录的方法实现。
解决方案:
仅能对包含"Host: "头的HTTP/1.1请求实现。可以使用以下规则集内部地将http://www.username.host.com/anypath重写为/home/username/anypath
RewriteEngine on
RewriteCond   %{HTTP_HOST}                 ^www\.[^.]+\.host\.com$
RewriteRule   ^(.+)                        %{HTTP_HOST}$1          [C]
RewriteRule   ^www\.([^.]+)\.host\.com(.*) /home/$1$2

为外来访问者重定向用户主目录
描述:
对不是来自本地域ourdomain.com的外来访问者的请求,重定向其用户主目录URL到另一个web服务器www.somewhere.com,有时这种做法也会用在虚拟主机的配置段中。
解决方案:
只须一个重写条件:
RewriteEngine on
RewriteCond   %{REMOTE_HOST}  !^.+\.ourdomain\.com$
RewriteRule   ^(/~.+)         http://www.somewhere.com/$1 [R,L]

重定向锚
描述:
默认情况下,重定向到一个HTML锚是不可行的,因为’#'会被转义为’%23′。This, in turn, breaks the redirection.
解决方案:
在RewriteRule指令中使用[NE]标志(不转义)。

依赖于时间的重写
描述:
在页面内容需要按时间的不同而变化的场合,比如重定向特定页面等,许多网管仍然采用CGI脚本的方法,如何用mod_rewrite来实现呢?
解决方案:
有许多名为TIME_xxx的变量可以用在重写条件中,联合使用词典模式的"<STRING", "=STRING", ">STRING"比较,就可以实现依赖于时间的重写:

RewriteEngine on
RewriteCond   %{TIME_HOUR}%{TIME_MIN} >0700
RewriteCond   %{TIME_HOUR}%{TIME_MIN} <1900
RewriteRule   ^foo\.html$             foo.day.html
RewriteRule   ^foo\.html$             foo.night.html

此例使foo.html在07:00-19:00时间内指向foo.day.html,而在其余时间指向foo.night.html,对主页是一个不错的功能…

对YYYY转变为XXXX的向前兼容
描述:
在转变了大批document.YYYY文件为document.XXXX后(比如.html→.phtml),如何保持URL的向前兼容(仍然虚拟地存在)?
解决方案:
只须按基准文件名重写,并测试带有新的扩展名的文件是否存在,如果存在则用新的,否则仍然用原来的。

# 将document.html重写为document.phtml的向后兼容的规则集
# 当且仅当document.phtml存在且document.html不存在的时候
RewriteEngine on
RewriteBase   /~quux/
# 剪切并记住basename
RewriteRule   ^(.*)\.html$              $1      [C,E=WasHTML:yes]
# 如果存在的话就重写为document.phtml
RewriteCond   %{REQUEST_FILENAME}.phtml -f
RewriteRule   ^(.*)$ $1.phtml                   [S=1]
# 否则返回先前的basename
RewriteCond   %{ENV:WasHTML}            ^yes$
RewriteRule   ^(.*)$ $1.html

内容处理
从旧到新(内部)
描述:
假定已经把文件foo.html改名为bar.html,需要对老的URL向后兼容,即让用户仍然可以使用老的URL,而感觉不到文件被改名了。
解决方案:
通过以下规则内部地将老的URL重写为新的:
RewriteEngine  on
RewriteBase    /~quux/
RewriteRule    ^foo\.html$  bar.html

从旧到新(外部)
描述:
仍然假定已经把文件foo.html改名为bar.html,需要对老的URL向后兼容,但是要让用户得到文件被改名的暗示,即浏览器的地址栏中显示的是新的URL。
解决方案:
作一个HTTP的强制重定向以改变浏览器和用户界面上的显示:
RewriteEngine  on
RewriteBase    /~quux/
RewriteRule    ^foo\.html$  bar.html  [R]

从静态到动态
描述:
如何无缝转换静态页面foo.html为动态的foo.cgi,而不为浏览器/用户所察觉。
解决方案:
只须重写此URL为CGI-script,并强制作为CGI-script运行的MIME类型。比如对/~quux/foo.html的请求会执行/~quux/foo.cgi 。
RewriteEngine  on
RewriteBase    /~quux/
RewriteRule    ^foo\.html$  foo.cgi  [T=application/x-httpd-cgi]

访问控制
阻止Robot
描述:
如何阻止一个完全匿名的Robot取得特定网络区域的页面?/robots.txt文件可以包含若干"Robot排除协议"行,但不足以阻止此类Robot。
解决方案:
可以用一个规则集以拒绝对网络区域/~quux/foo/arc/(对一个很深的目录区域进行列表可能会使服务器产生很大的负载)的访问。还必须确保仅阻止特定的Robot,也就是说,仅仅阻止Robot访问主机是不够的(这样会同时阻止用户访问该主机)。为此,就需要对HTTP头的User-Agent信息作匹配。
RewriteCond %{HTTP_USER_AGENT}   ^NameOfBadRobot.*
RewriteCond %{REMOTE_ADDR}       ^123\.45\.67\.[8-9]$
RewriteRule ^/~quux/foo/arc/.+   -   [F]

阻止内嵌的图片
描述:
假设http://www.quux-corp.de/~quux/有一些内嵌GIF图片的页面,这些图片很好,所以就有人盗链到他们自己的页面中了。由于这样徒然增加了我们服务器的流量,因此,我们不愿意这种事情发生。
解决方案:
虽然,我们不能100%地保护这些图片不被写入别人的页面,但至少可以对发出HTTP Referer头的浏览器加以限制。
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://www.quux-corp.de/~quux/.*$ [NC]
RewriteRule .*\.gif$        -                                    [F]

RewriteCond %{HTTP_REFERER}         !^$
RewriteCond %{HTTP_REFERER}         !.*/foo-with-gif\.html$
RewriteRule ^inlined-in-foo\.gif$   -                        [F]

拒绝代理
描述:
如何拒绝某个主机或者来自特定主机的用户使用Apache代理?
解决方案:
首先,要确保在配置文件中mod_rewrite位于mod_proxy之后!使它在mod_proxy之前被调用。然后,使用如下方法拒绝某个主机:
RewriteCond %{REMOTE_HOST} ^badhost\.mydomain\.com$
RewriteRule !^http://[^/.]\.mydomain.com.*  – [F]

使用如下方法拒绝user@host-dependent用户:

RewriteCond %{REMOTE_IDENT}@%{REMOTE_HOST}  ^badguy@badhost\.mydomain\.com$
RewriteRule !^http://[^/.]\.mydomain.com.*  – [F]

其它
外部重写引擎
描述:
如何解决似乎无法用mod_rewrite解决的FOO/BAR/QUUX/之类的问题?
解决方案:
可以使用一个与RewriteMap功能相同的外部RewriteMap程序,一旦它在Apache启动时被执行,则从STDIN接收被请求的URL ,并将处理过(通常是重写过的)的URL(以相同顺序)在STDOUT输出。
RewriteEngine on
RewriteMap    quux-map       prg:/path/to/map.quux.pl
RewriteRule   ^/~quux/(.*)$  /~quux/${quux-map:$1}

#!/path/to/perl

# 禁止使用会导致Apache陷入死循环的I/O缓冲
$| = 1;

# 从stdin读取URL(每行一个),并在stdout输出替换URL
while (<>) {
    s|^foo/|bar/|;
    print $_;
}

这是只是一个简单的示例,只是把所有的/~quux/foo/…重写为/~quux/bar/…而已。但事实上,可以把它修改成任何你想要的输出。但是要注意,虽然一般用户都可以使用,可是只有系统管理员才可以定义这样的映射。

初级URL重写指南

归类于网站建设知识 | 参与评论

本文是mod_rewrite参考文档的补充材料。阐述在实际应用中如何解决网管所面临的基于URL的典型问题,并详细描述了如何配置URL重写规则集以解决这些问题。

注意:根据你的服务器配置,有可能必须对这里的例子作些小修改,比如,在额外启用mod_alias和mod_userdir的情况下要增加[PT]标志,或者为了适应目录级(.htaccess)的配置而将针对服务器级的规则集进行重写。对一个特定的规则集应该先透彻理解然后再考虑应用,这样才能避免出现问题。

规范化URL
描述:
在有些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]

但是这样一来会增加处理上的开销。

将用户主目录移动到不同web服务器
描述:
通常,许多网管在建立一个新的web服务器时,都会有这样的要求:重定向一个web服务器上的所有用户主目录到另一个web服务器。
解决方案:
很简单,在老的web服务器上重定向所有的"/~user/anypath"到"http://newserver/~user/anypath":
RewriteEngine on
RewriteRule   ^/~(.+)  http://newserver/~$1  [R,L]

在多个目录中搜索页面
描述:
有时会有必要使web服务器在多个目录中搜索页面,对此,MultiViews或者其他技术无能为力。
解决方案:
编制一个明确的规则集以搜索目录中的文件:
RewriteEngine on

# 首先尝试在 dir1 中寻找,找到即停
RewriteCond         /your/docroot/dir1/%{REQUEST_FILENAME}  -f
RewriteRule  ^(.+)  /your/docroot/dir1/$1  [L]

# 然后尝试在 dir2 中寻找,找到即停
RewriteCond         /your/docroot/dir2/%{REQUEST_FILENAME}  -f
RewriteRule  ^(.+)  /your/docroot/dir2/$1  [L]

# 再找不到就继续寻找其他的 Alias 或 ScriptAlias 目录
RewriteRule   ^(.+)  -  [PT]

按照URL的片段设置环境变量
描述:
希望保持请求之间的状态信息,又不希望使用CGI来包装所有页面,只是通过分离URL中的有用信息来做到。
解决方案:
可以用一个规则集来分离出状态信息,并设置环境变量以备此后用于XSSI或CGI。这样,一个"/foo/S=java/bar/"的URL会被解析为"/foo/bar/",而环境变量STATUS则被设置为"java"。
RewriteEngine on
RewriteRule   ^(.*)/S=([^/]+)/(.*)    $1/$3 [E=STATUS:$2]

虚拟用户主机
描述:
如果需要为用户username支持一个www.username.host.domain.com的主页,但不在此机器上建虚拟主机,而是仅用在此机器上增加一个DNS A记录的方法实现。
解决方案:
仅能对包含"Host: "头的HTTP/1.1请求实现。可以使用以下规则集内部地将http://www.username.host.com/anypath重写为/home/username/anypath
RewriteEngine on
RewriteCond   %{HTTP_HOST}                 ^www\.[^.]+\.host\.com$
RewriteRule   ^(.+)                        %{HTTP_HOST}$1          [C]
RewriteRule   ^www\.([^.]+)\.host\.com(.*) /home/$1$2

为外来访问者重定向用户主目录
描述:
对不是来自本地域ourdomain.com的外来访问者的请求,重定向其用户主目录URL到另一个web服务器www.somewhere.com,有时这种做法也会用在虚拟主机的配置段中。
解决方案:
只须一个重写条件:
RewriteEngine on
RewriteCond   %{REMOTE_HOST}  !^.+\.ourdomain\.com$
RewriteRule   ^(/~.+)         http://www.somewhere.com/$1 [R,L]

重定向锚
描述:
默认情况下,重定向到一个HTML锚是不可行的,因为’#'会被转义为’%23′。This, in turn, breaks the redirection.
解决方案:
在RewriteRule指令中使用[NE]标志(不转义)。

依赖于时间的重写
描述:
在页面内容需要按时间的不同而变化的场合,比如重定向特定页面等,许多网管仍然采用CGI脚本的方法,如何用mod_rewrite来实现呢?
解决方案:
有许多名为TIME_xxx的变量可以用在重写条件中,联合使用词典模式的"<STRING", "=STRING", ">STRING"比较,就可以实现依赖于时间的重写:

RewriteEngine on
RewriteCond   %{TIME_HOUR}%{TIME_MIN} >0700
RewriteCond   %{TIME_HOUR}%{TIME_MIN} <1900
RewriteRule   ^foo\.html$             foo.day.html
RewriteRule   ^foo\.html$             foo.night.html

此例使foo.html在07:00-19:00时间内指向foo.day.html,而在其余时间指向foo.night.html,对主页是一个不错的功能…

对YYYY转变为XXXX的向前兼容
描述:
在转变了大批document.YYYY文件为document.XXXX后(比如.html→.phtml),如何保持URL的向前兼容(仍然虚拟地存在)?
解决方案:
只须按基准文件名重写,并测试带有新的扩展名的文件是否存在,如果存在则用新的,否则仍然用原来的。

# 将document.html重写为document.phtml的向后兼容的规则集
# 当且仅当document.phtml存在且document.html不存在的时候
RewriteEngine on
RewriteBase   /~quux/
# 剪切并记住basename
RewriteRule   ^(.*)\.html$              $1      [C,E=WasHTML:yes]
# 如果存在的话就重写为document.phtml
RewriteCond   %{REQUEST_FILENAME}.phtml -f
RewriteRule   ^(.*)$ $1.phtml                   [S=1]
# 否则返回先前的basename
RewriteCond   %{ENV:WasHTML}            ^yes$
RewriteRule   ^(.*)$ $1.html

内容处理
从旧到新(内部)
描述:
假定已经把文件foo.html改名为bar.html,需要对老的URL向后兼容,即让用户仍然可以使用老的URL,而感觉不到文件被改名了。
解决方案:
通过以下规则内部地将老的URL重写为新的:
RewriteEngine  on
RewriteBase    /~quux/
RewriteRule    ^foo\.html$  bar.html

从旧到新(外部)
描述:
仍然假定已经把文件foo.html改名为bar.html,需要对老的URL向后兼容,但是要让用户得到文件被改名的暗示,即浏览器的地址栏中显示的是新的URL。
解决方案:
作一个HTTP的强制重定向以改变浏览器和用户界面上的显示:
RewriteEngine  on
RewriteBase    /~quux/
RewriteRule    ^foo\.html$  bar.html  [R]

从静态到动态
描述:
如何无缝转换静态页面foo.html为动态的foo.cgi,而不为浏览器/用户所察觉。
解决方案:
只须重写此URL为CGI-script,并强制作为CGI-script运行的MIME类型。比如对/~quux/foo.html的请求会执行/~quux/foo.cgi 。
RewriteEngine  on
RewriteBase    /~quux/
RewriteRule    ^foo\.html$  foo.cgi  [T=application/x-httpd-cgi]

访问控制
阻止Robot
描述:
如何阻止一个完全匿名的Robot取得特定网络区域的页面?/robots.txt文件可以包含若干"Robot排除协议"行,但不足以阻止此类Robot。
解决方案:
可以用一个规则集以拒绝对网络区域/~quux/foo/arc/(对一个很深的目录区域进行列表可能会使服务器产生很大的负载)的访问。还必须确保仅阻止特定的Robot,也就是说,仅仅阻止Robot访问主机是不够的(这样会同时阻止用户访问该主机)。为此,就需要对HTTP头的User-Agent信息作匹配。
RewriteCond %{HTTP_USER_AGENT}   ^NameOfBadRobot.*
RewriteCond %{REMOTE_ADDR}       ^123\.45\.67\.[8-9]$
RewriteRule ^/~quux/foo/arc/.+   -   [F]

阻止内嵌的图片
描述:
假设http://www.quux-corp.de/~quux/有一些内嵌GIF图片的页面,这些图片很好,所以就有人盗链到他们自己的页面中了。由于这样徒然增加了我们服务器的流量,因此,我们不愿意这种事情发生。
解决方案:
虽然,我们不能100%地保护这些图片不被写入别人的页面,但至少可以对发出HTTP Referer头的浏览器加以限制。
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://www.quux-corp.de/~quux/.*$ [NC]
RewriteRule .*\.gif$        -                                    [F]

RewriteCond %{HTTP_REFERER}         !^$
RewriteCond %{HTTP_REFERER}         !.*/foo-with-gif\.html$
RewriteRule ^inlined-in-foo\.gif$   -                        [F]

拒绝代理
描述:
如何拒绝某个主机或者来自特定主机的用户使用Apache代理?
解决方案:
首先,要确保在配置文件中mod_rewrite位于mod_proxy之后!使它在mod_proxy之前被调用。然后,使用如下方法拒绝某个主机:
RewriteCond %{REMOTE_HOST} ^badhost\.mydomain\.com$
RewriteRule !^http://[^/.]\.mydomain.com.*  – [F]

使用如下方法拒绝user@host-dependent用户:

RewriteCond %{REMOTE_IDENT}@%{REMOTE_HOST}  ^badguy@badhost\.mydomain\.com$
RewriteRule !^http://[^/.]\.mydomain.com.*  – [F]

其它
外部重写引擎
描述:
如何解决似乎无法用mod_rewrite解决的FOO/BAR/QUUX/之类的问题?
解决方案:
可以使用一个与RewriteMap功能相同的外部RewriteMap程序,一旦它在Apache启动时被执行,则从STDIN接收被请求的URL ,并将处理过(通常是重写过的)的URL(以相同顺序)在STDOUT输出。
RewriteEngine on
RewriteMap    quux-map       prg:/path/to/map.quux.pl
RewriteRule   ^/~quux/(.*)$  /~quux/${quux-map:$1}

#!/path/to/perl

# 禁止使用会导致Apache陷入死循环的I/O缓冲
$| = 1;

# 从stdin读取URL(每行一个),并在stdout输出替换URL
while (<>) {
    s|^foo/|bar/|;
    print $_;
}

这是只是一个简单的示例,只是把所有的/~quux/foo/…重写为/~quux/bar/…而已。但事实上,可以把它修改成任何你想要的输出。但是要注意,虽然一般用户都可以使用,可是只有系统管理员才可以定义这样的映射。

Htaccess

归类于网站建设知识 | 参与评论

启用.htaccess
如何让自己的本地Apache服务器支持".htaccess"呢?其实只要简单修改一下apache的httpd.conf设置就可以让APACHE支持.htaccess了。打开httpd.conf文件(在那里? APACHE目录的CONF目录里面),用文本编辑器打开后,查找

<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
改为

<Directory />
Options FollowSymLinks
AllowOverride All
</Directory>
就可以了

如何建立.htaccess文件
.htaccess就是一个普通的文本文件,这样的文件在windows操作系统中无法建立,可以先建立一个htaccess.txt文件,上传到服务器以后再修改名车即可。

.htaccess使用实例
.htaccess使用实例收集整理.htaccess的具体应用,供大家参考和快速使用。

使用.htaccess文件的场合
一般情况下,不应该使用.htaccess文件,除非你对主配置文件没有访问权限。有一种很常见的误解,认为用户认证只能通过.htaccess文件实现,其实并不是这样,把用户认证写在主配置文件中是完全可行的,而且是一种很好的方法。

.htaccess文件应该被用在内容提供者需要针对特定目录改变服务器的配置而又没有root权限的情况下。如果服务器管理员不愿意频繁修改配置,则可以允许用户通过.htaccess文件自己修改配置,尤其是ISP在同一个机器上运行了多个用户站点,而又希望用户可以自己改变配置的情况下。

虽然如此,一般都应该尽可能地避免使用.htaccess文件。任何希望放在.htaccess文件中的配置,都可以放在主配置文件的<Directory>段中,而且更高效。

避免使用.htaccess文件有两个主要原因。

首先是性能。如果AllowOverride启用了.htaccess文件,则Apache需要在每个目录中查找.htaccess文件,因此,无论是否真正用到,启用.htaccess都会导致性能的下降。另外,对每一个请求,都需要读取一次.htaccess文件。

还有,Apache必须在所有上级的目录中查找.htaccess文件,以使所有有效的指令都起作用(参见指令的生效),所以,如果请求/www/htdocs/example中的页面,Apache必须查找以下文件:

/.htaccess
/www/.htaccess
/www/htdocs/.htaccess
/www/htdocs/example/.htaccess
总共要访问4个额外的文件,即使这些文件都不存在。(注意,这可能仅仅由于允许根目录"/"使用.htaccess ,虽然这种情况并不多。)

其次是安全。这样会允许用户自己修改服务器的配置,这可能会导致某些意想不到的修改,所以请认真考虑是否应当给予用户这样的特权。但是,如果给予用户较少的特权而不能满足其需要,则会带来额外的技术支持请求,所以,必须明确地告诉用户已经给予他们的权限,说明AllowOverride设置的值,并引导他们参阅相应的说明,以免日后生出许多麻烦。

注意,在/www/htdocs/example目录下的.htaccess文件中放置指令,与在主配置文件中<Directory /www/htdocs/example>段中放置相同指令,是完全等效的。

/www/htdocs/example目录下的.htaccess文件: /www/htdocs/example目录下的.htaccess文件的内容:

AddType text/example .exm httpd.conf文件中摘录的内容:

<Directory /www/htdocs/example>
AddType text/example .exm
</Directory>
但是,把配置放在主配置文件中更加高效,因为只需要在Apache启动时读取一次,而不是在每次文件被请求时都读取。

将AllowOverride设置为none可以完全禁止使用.htaccess文件:

AllowOverride None
虚拟主机环境中,因为管理员不能让所有用户修改服务器配置文件,所以通过.htaccess修改配置就是必要的。用户经常会用.htaccess文件来设置Rewrite 目录密码保护 默认页面或者是覆盖服务器的其他设置

顶部

uggs bailey button tripletugg bailey buttonUGG Jimmy Choocheap uggskensington uggsugg adirondack tallkensington uggsugg retro cargougg 5825ugg bailey button bootsuggs kensingtonuggs bailey button tripletugg moccasinsuggs classic tallugg sparkles boots