关于.htaccess的配置

langqiao 2012-02-08

1.开启mod_rewrite

将#LoadModulerewrite_modulemodules/mod_rewrite.so

这行的#去掉

2.修改httpd.conf

1)将你的网站目录配置中的

AllowOverride None 改为AllowOverride All

2)修改Options的属性建议改为Indexes FollowSymLinks

FollowSymLinks

服务器允许在此目录中使用符号连接。

Indexes

如果一个映射到目录的URL被请求,而此目录中又没有DirectoryIndex(例如:index.html),那么服务器会返回由mod_autoindex生成的一个格式化后的目录列表。

说明:由于目前apache2.2版本以后Options默认的值是None,导致启用.htaccess后出现403错误。这个问题困扰了很久,因为开始没有注意到这个问题。所有很长时间在本地无法测试re_write功能的程序。

昨天晚上看apache的error.log时看到

[SatAug0923:06:192008][error][client127.0.0.1]OptionsFollowSymLinksorSymLinksIfOwnerMatchisoffwhichimpliesthatRewriteRuledirectiveisforbidden:G:/hekey/www/111/post/0,referer:http://localhost/111/admin.php?go=misc_urlrewrite

错误的时候才知道是Options的问题

在网上找了很多篇关于配置apache mod_rewrite的文章,发觉这篇最有用,大家需要的可参考一下。

1,通过php提供的phpinfo()函数查看环境配置,通过Ctrl+F查找到“Loaded Modules”,其中列出了所有apache2handler已经开启的模块,如果里面包括“mod_rewrite”,则已经支持,不再需要继续设置。如果没有开启“mod_rewrite”,则打开目录 您的apache安装目录“/apache/conf/”下的 httpd.conf 文件,通过Ctrl+F查找到“LoadModulerewrite_module”,将前面的”#”号删除即可。如果没有查找到,则到“LoadModule”区域,在最后一行加入“LoadModule rewrite_modulemodules/mod_rewrite.so”(必选独占一行),然后重启apache服务器即可。

2, 让apache服务器支持”.htaccess”

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

<Directory/>

OptionsFollowSymLinks

AllowOverrideNone

</Directory>

改为

<Directory/>

OptionsFollowSymLinks

AllowOverrideAll

</Directory>

就可以了

3,建立 “.htaccess” 文件

如果是在windows平台下,刚开始还真不知道怎么建立”.htaccess”文件,因为这个文件实际上没有文件名,仅仅只有扩展名,通过普通方式是无法建立这个文件的,别着急,马上告诉你三种方法:

三种方法都是先建立一个htaccess.txt的文本文件(当然,这个文本文件的名字你可以随便取),然后有三种方式给这个文件重命名:(1)用记事本打开,点击文件–另存为,在文件名窗口输入”.htaccess”,注意是整个绿色部分,也就是包含英文引号,然后点击保存就行了。(2)进入cmd命令窗口,通过cd切换当刚建立htaccess.txt文件的文件夹,然后输入命令:renamehtaccess.txt.htaccess,然后点击键盘Enter键即可。(3)通过ftp连接htaccess.txt所在文件夹,通过ftp软件重命名。

那么我们须要建立几个“.htaccess”文件,里面又输入什么内容呢?基本的原则是这样,根目录必须有一个,用于重定向(URl重写)所有的请求都会转到到index.php(交给前端控制器);”./application”文件夹下须要一个,用于拒绝所有针对该文件夹内容的直接访问(比如http://localhost/application/models/User.php),这样做是因为所有访问请求必选通过前端控制器来分配访问,其次为了安全;“./library”文件夹下的“.htaccess”同前;”./public”文件夹下必选建一个,因为这个文件夹的文件全部是供前端直接访问的,因此须要撤销URl重写。以下是4个“./htaccess”文件的内容:

./.htaccess

RewriteEngineon

RewriteRule!/.(js|ico|gif|jpg|png|css)$index.php

./application/.htaccess

denyfromall

./library/.htaccess

denyfromall

./public

RewriteEngineoff

实际上,apache的url重写功能也可以直接在httpd.conf文件中进行设置,这里就不具体讲了,网上相关的教程也很多。

rewrite标志

R[=code](force redirect) 强制外部重定向

强制在替代字符串加上http://thishost[:thisport]/前缀重定向到外部的URL.如果code不指定,将用缺省的302HTTP状态码。

F(forceURLtobeforbidden)禁用URL,返回403HTTP状态码。

G(forceURLtobegone)强制URL为GONE,返回410HTTP状态码。

P(forceproxy)强制使用代理转发。

L(lastrule)表明当前规则是最后一条规则,停止分析以后规则的重写。

N(nextround)重新从第一条规则开始运行重写过程。

C(chainedwithnextrule)与下一条规则关联

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

T=MIME-type(forceMIMEtype)强制MIME类型

NS(usedonlyifnointernalsub-request)只用于不是内部子请求

NC(nocase)不区分大小写

QSA(querystringappend)追加请求字符串

NE(noURIescapingofoutput)不在输出转义特殊字符

例如:RewriteRule/foo/(.*)/bar?arg=P1/%3d$1[R,NE]将能正确的将/foo/zoo转换成/bar?arg=P1=zed

PT(passthroughtonexthandler)传递给下一个处理

例如:

RewriteRule^/abc(.*)/def$1[PT]#将会交给/def规则处理

Alias/def/ghi

S=num(skipnextrule(s))跳过num条规则

E=VAR:VAL(set environment variable) 设置环境变量

rewrite时服务器变量:

HTTPheaders:HTTP_USER_AGENT,HTTP_REFERER,HTTP_COOKIE,HTTP_HOST,HTTP_ACCEPT

connection&request:REMOTE_ADDR,QUERY_STRING

serverinternals:DOCUMENT_ROOT,SERVER_PORT,SERVER_PROTOCOL

system stuff: TIME_YEAR, TIME_MON, TIME_DAY

Rewrite规则表达式的说明:

.匹配任何单字符

[chars]匹配字符串:chars

[^chars]不匹配字符串:chars

text1|text2可选择的字符串:text1或text2

?匹配0到1个字符

*匹配0到多个字符

+匹配1到多个字符

^字符串开始标志

$字符串结束标志

/n 转义符标志

反向引用 $N 用于 RewriteRule 中匹配的变量调用(0 <= N <= 9) 反向引用 %N 用于 RewriteCond 中最后一个匹配的变量调用(1 <= N <= 9)

RewriteCond标志符

'nocase|NC'(nocase)忽略大小'ornext|OR' (or next condition)逻辑或,可以同时匹配多个RewriteCond条件

RewriteRule适用的标志符

'redirect|R[=code]'(forceredirect)强迫重写为基于http开头的外部转向(注意URL的变化)如:[R=301,L]

'forbidden|F'(forceURLtobeforbidden)重写为禁止访问

'proxy|P'(forceproxy)重写为通过代理访问的http路径

'last|L'(lastrule)最后的重写规则标志,如果匹配,不再执行以后的规则

'next|N'(nextround)循环同一个规则,直到不能满足匹配

'chain|C'(chainedwithnextrule)如果匹配该规则,则继续下面的有Chain标志的规则。

'type|T=MIME-type'(forceMIMEtype)指定MIME类型

'nosubreq|NS'(usedonlyifnointernalsub-request)如果是内部子请求则跳过

'nocase|NC'(nocase)忽略大小

'qsappend|QSA'(querystringappend)附加查询字符串

'noescape|NE'(noURIescapingofoutput)禁止URL中的字符自动转义成%[0-9]+的形式。

'passthrough|PT'(passthroughtonexthandler)将重写结果运用于mod_alias

'skip|S=num'(skipnextrule(s))跳过下面几个规则

'env|E=VAR:VAL' (set environment variable)添加环境变量

实际操作

例子:

RewriteEngineon

RewriteCond%{HTTP_USER_AGENT}^MSIE[NC,OR]

RewriteCond%{HTTP_USER_AGENT}^Opera[NC]

RewriteRule ^.* - [F,L] 这里”-”表示没有替换,浏览器为IE和Opera的访客将被禁止访问。

例子:

RewriteEngineOn

RewriteBase/test

RewriteCond%{REQUEST_FILENAME}.php-f

RewriteRule([^/]+)$/test/$1.php

#forexample:/test/admin=>/test/admin.php

RewriteRule([^/]+)/.html$/test/$1.php[L]

#for example: /test/admin.html => /test/admin.php

限制目录只能显示图片

<IfModulemod_rewrite.c>

RewriteEngineon

RewriteCond%{REQUEST_FILENAME}!^.*/.(gif|jpg|jpeg|png|swf)$

RewriteRule.*$-[F,L]

</IfModule>

相关推荐