.htaccess
在目录下新建一个
.htaccess
文件,随笔输入一串字符(毫无心义),看看什么反应,若是是500错误,说明目前环境是支持.htaccess
的php
fjdklsaj
转载请注明: http://www.cnblogs.com/ganiks/ css
# no one gets in here! deny from all
Order命令是一个难点,也是配置apache的基础,它决定了Apache处理访问规则的顺序。 html
经过Allow,Deny参数,Apache首先找到并应用Allow命令,而后应用Deny命令,以阻止全部访问。
经过Deny,Allow参数,Apache首先找到并应用Deny命令,而后应用Allow命令,以容许全部访问。 正则表达式
假设本地的IP为
192.168.4.126
apache
Order Deny,Allow Deny from All Allow from 192.168.4.126
本地访问成功,非本地IP访问 403
Forbidden 数组
下例能够限制全部含有“domain.com”的网络主机访问网站:浏览器
Order Allow,Deny Allow from all Deny from .*domain\.com.*
Order Deny,Allow Deny from All Allow from 192.168.4.126 <Files favicon.ico> order allow,deny deny from all </Files>
Order Deny,Allow Deny from All Allow from 192.168.4.126 <FilesMatch ".(txt|ico)$"> order allow,deny deny from all </FilesMatch>
Files以后的波浪线用于开启“正则表达式”分析。请注意,这是个过期的用法,Apache更推荐使用指令[3]
正则表达式必须在双引号之间,有关htaccess的正则表达式用法,请查阅本站《.htaccess正则表达式》一文。
双引号中的“管道符”(|)用于将两种文件类型(.log和.exe)分开,至关于逻辑“或”
Order命令必须嵌在Files节(Section)中,不然将会应用到全部文件
Satisfy All表示必须同时知足主机级别(Allow/Denay)和用户级别(Require)的限制,All是默认值,该行能够省略。安全
暂不研究 服务器
Options All -Indexes IndexIgnore * Options All +Indexes
这3种设置分别对应下面3个图:网络
IndexIgnore *.php *.txt~ Copy*
<IfModule mod_autoindex.c> IndexOptions FancyIndexing </ifModule>
http://corz.org/public/images/demo/
http://corz.org/server/resources/file_view.htaccess.txt?raw=true
DirectoryIndex index.html index.php index.htm
# custom error documents ErrorDocument 401 /err/401.php ErrorDocument 403 /err/403.php ErrorDocument 404 /err/404.php ErrorDocument 500 /err/500.php
1、准备开始:mod_rewrite 2、利用.htaccess实现URL重写(rewrite)与URL重定向(redirect) 将.htm页面映射到.php 临时重定向(R=302)与永久重定向(R=301) 为何要用重定向?——重定向和URL重写的区别 长短地址转换 去掉www 加上www 支持多域名访问 3、改写查询字符串QUERY_STRING 利用QSA转换查询字符串QUERY_STRING 利用RewriteCond改写查询字符串QUERY_STRING QSA与RewriteCond双剑齐发 剥离查询字符串 4、利用RewriteCond和RewriteRule进行访问控制 文件访问控制 用.htaccess阻止User-agent 用.htaccess阻止盗链(hot-linking) References
mod_rewrite
sudo a2enmod rewrite
<IfModule mod_rewrite.c> Options +FollowSymlinks RewriteEngine on # More rules below ... </IfModule>
FollowSymlinks
必须启用,这是 rewrite 引擎的安全需求 mod_rewrite
会处理全部的提交给Apache 的URL请求, 并与以后的规则进行匹配 .htaccess
实现URL重写和URL重定向.htm
页面映射到.php
页面<IfModule mod_rewrite.c> Options +FollowSymlinks RewriteEngine on RewriteRule ^(.*)\.htm$ $1.php [NC] </IfModule>
[NC] No Case(不区分大小写): 对客户端请求的URL不区分大小写
若是经过.htm进入,浏览器地址栏显示的是.htm扩展名,但服务器上实际执行的是.php
必须保证服务器上有对应的.php,不然会404
浏览器和搜索引擎能够同时经过.htm和.php访问网页
test.htm
this is .htm
test.php
this is .php
<IfModule mod_rewrite.c> RewriteEngine on RewriteBase / RewriteRule ^(.*)\.htm$ $1.php [R,NC,L] </IfModule>
注意事项:
RewriteBase定义了重写基准目录。
字母L表示若是能匹配本条规则,那么本条规则是最后一条(Last),忽略以后的规则。
<IfModule mod_rewrite.c> RewriteEngine on RewriteBase / RewriteRule ^(.*)$ http://newdomain/$1 [R=301,NC,L] </IfModule>
利用URL重写,咱们能够很方便地实现长短地址的转换,可是用重定向就不合适了。
RewriteEngine On RewriteRule ^grab /public/files/download/download.php
若访问
http://mysite/grab?file=my.zip
则会执行该页面:
http://mysite/public/files/download/download.php?file=my.zip
<IfModule mod_rewrite.c> Options +FollowSymlinks RewriteEngine on RewriteCond %{HTTP_HOST} ^www\.(.*) [NC] RewriteRule ^(.*)$ http://%1/$1 [R=301,NC,L] </IFModule>
<IfModule mod_rewrite.c> Options +FollowSymlinks RewriteEngine on RewriteCond %{HTTP_HOST} ^(.*)$ RewriteRule (.*) http://www\.%1/$1 [R=301,L] </IFModule>
若是你不凑巧买到了不支持多域名的主机,那么.htaccess或许能够帮助你。如今假设你有域名domain-one.com和domain- two.com,而且在服务器根目录有对应文件夹one和two,那么经过下面的改写就能让Apache同时接受者两个域名的请求:
#two domains served from one root.. RewriteCond %{HTTP_HOST} domain-one.com RewriteCond %{REQUEST_URI} !^/one RewriteRule ^(.*)$ /one/$1 [L] RewriteCond %{HTTP_HOST} domain-two.com RewriteCond %{REQUEST_URI} !^/two RewriteRule ^(.*)$ /two/$1 [L]
QUERY_STRING
查询字符串是指URL请求中“问号”后面的部分。好比,http://mysite/grab?foo=bar 中粗体部分就是查询字符串,其中变量名是foo,值是bar。
QSA(Query String Appending) 用于在 URI中截取查询字符串, 这个截取操做室经过小括号正则实现的
RewriteEngine On RewriteRule /pages/(.+) /page.php?page=$1 [QSA] RewriteRule ^/([^/]+)/([^/]+)/? /index.php?first-var=$1&second-var=$2 [QSA]
这里经过 QSA , 将简单的连接 /simple/flat/link/
映射到 server-side.php?first-val=flat&second-var=link
/pages/123?one=two
映射到 /page.php?page=123&one=two
/page.php?page=123
/page.php?page=$1
中 问号以后的部分将会剥离丢弃。 RewriteEngine On RewriteCond %{QUERY_STRING} foo=(.*) RewriteRule ^grab(.*) /page.php?bar=%1
RewriteEngine On RewriteCond %{QUERY_STRING} foo=(.+) RewriteRule ^grab/(.*) /%1/index.php?file=$1 [QSA]
只需在要开始剥离的连接后面加个“问号”,而且不要启用QSA标志,就可剥离查询字符串
RewriteEngine On # Whatever QS is RewriteCond %{QUERY_STRING} . # I don't want it with Question mark RewriteRule foo.php(.*) /foo.php? [L]
RewriteCond
和 RewriteRule
进行访问控制咱们在第一篇.htaccess基础中提到了不少有用的访问控制方法,其实经过Rewrite也能实现相似的功能,并且能够更强大!
以前利用Order、Files及FilesMatch命令实现的访问控制能够知足大部分要求,可是当用户被拒绝时,他们看到的是硕大的“403 Forbidden”,若是你不想伤害用户的感情,就须要显示一些别的东西,经过Rewrite就能够实现这个特性:
RewriteEngine On RewriteCond %{REQUEST_FILENAME} !^(.+)\.css$ RewriteCond %{REQUEST_FILENAME} !^(.+)\.js$ RewriteCond %{REQUEST_FILENAME} !special.zip$ RewriteRule ^(.+)$ /chat/ [NC]
该规则将仅容许用户请求.css, .js类型的文件,还有special.zip文件
RewriteRule 后面指定了限制规则:映射到/char/目录下处理
RewriteCond 后面的“感叹号”(!)起到了“否认”做用,它代表,对不知足后面正则表达式者应用RewriteRule规则,也就是对当前类型的文件将不该用规则
RewriteCond 之间是以逻辑“与”链接的,也就是只有当三个条件都不知足时才执行RewriteRule
该规则也会限制访问.htm, .jpg等格式
该规则不能够放在虚拟站点根目录(/)下,不然会死循环
若是是二级目录,如/test/,那么传入RewriteCond的参数是以/test/开始的,所以从(.+)得到的文件名也含有/test/,读者必须对此多加当心
要想仅得到文件名,能够将(.+)替换成([^/]+),而且去掉符号^,以下所示:
RewriteEngine On RewriteCond %{REQUEST_FILENAME} !([^/]+)\.css$ RewriteCond %{REQUEST_FILENAME} !([^/]+)\.js$ RewriteRule ^(.+)$ /chat/ [NC]
什么是User-agent?User-agent用于浏览器向服务器“自报家门”,更确切的说是全部HTTP客户端都得用User-agent向 服务器“自报家门”,以便服务器对不一样的客户端做出不一样响应。好比,某站点可能须要对浏览器、搜索引擎crawl还有各种下载工具做出不一样的响应。服务器 就是经过所谓的User-agent进行区分的。
若是你的服务器提供某些资源的下载,那么你就必须多加当心诸如“迅雷”等下载软件,由于它们可能把你网站资源吸干,而且影响你的正常访客访问。为此,咱们能够利用Rewrite限制某些UA的访问:
RewriteEngine on RewriteCond %{HTTP_USER_AGENT} 2.0.50727 [NC] RewriteRule . abuse.txt [L]
该规则限制“迅雷”客户端下载资源,并将下载文件重置到abuse.txt
HTTP_USER_AGENT是Apache的内置变量
2.0.50727是迅雷User-agent的特征字符串
RewriteRule后面的“点”表示“任意URI”,也就是无论请求的是什么,都输出abuse.txt
一般,咱们不会仅限制一个UA。利用[OR]便可实现对多个UA做出统一处理:
RewriteEngine on RewriteCond %{HTTP_USER_AGENT} 2.0.50727 [NC,OR] RewriteCond %{HTTP_USER_AGENT} ^BlackWidow [NC,OR] # etc.. RewriteCond %{HTTP_USER_AGENT} ^Net\ Vampire [NC] RewriteRule . abuse.txt [L]
盗链,特别是图片,是很是可耻的!哪怕将图片复制到本身服务器上,也比盗用他人的图片连接来得光彩!(吐糟完毕)
.htaccess的Rewrite功能能够提供很是简单、有效的方法阻止这种可耻行为:
RewriteEngine On RewriteCond %{HTTP_REFERER} !^$ RewriteCond %{HTTP_REFERER} !^http://(www\.)?lesca\.me/ [NC] RewriteCond %{REQUEST_URI} !hotlink\.png [NC] RewriteRule .*\.(gif|jpg|png)$ /hotlink.png [NC]
简单解释一下该规则的功能:
转载请注明: http://www.cnblogs.com/ganiks/
# 位于行首时表示注释。 [F] Forbidden(禁止): 命令服务器返回 403 Forbidden错误给用户浏览器 [L] Last rule(最后一条规则): 告诉服务器在本条规则执行完后中止重写URL [N] Next(下一条规则): 告诉服务器继续重写,指导全部重写指令都执行过 [G] Gone(丢失): 命令服务器返回410 GONE(no longer exists)错误消息 [P] Proxy(代理): 告诉服务器经过mod_proxy模块处理用户请求 [C] Chain(捆绑): 告诉服务器将当前的规则和前面的规则进行捆绑 [R] Redirect(重定向): 命令服务器发出重定向消息,以便用户浏览器发出rewritten/modified(重写/修改)URL的请求 [NC] No Case(不区分大小写): 对客户端请求的URL不区分大小写 [PT] Pass Through(放行): 让mod_rewrite模块将重写的URL传回给Apache作进一步处理 [OR] Or(逻辑或): 用逻辑“或”将两个表达式链接在一块儿,若是结果为“真”,则会应用后继的相关规则 [NE] No Escape(禁用转义): 命令服务器在输出时禁用转义字符 [NS] No Subrequest(禁用子请求): 若是存在内部子请求,则跳过当前命令 [QSA] Append Query String(追加查询字符串): 命令服务器在URL末尾追加查询字符串 [S=x] Skip(跳过): 若是知足某指定的条件,则跳事后面第x调规则 [E=variable:value] Environmental Variable(环境变量): 命令服务器将值value赋给变量variable [T=MIME-type] Mime Type(MIME类型): 声明目标资源所属的MIME类型 [] 匹配一个字符集合,例如[xyz]能够匹配x, y或者z []+ 例如[xyz]+会以任何顺序、次数匹配x,y,z的出现 [^] 字符^表示字符集的补集。[^xyz]将匹配没有x,y或者z的字符串 [a-z] 连字符(-)表示匹配从字母a到字母z的全部字符串 a{n} 指定字母a出现的次数为n次,知足该条件时匹配。例如x{3}仅与xxx匹配 a{n,} 指定字母a出现的次数至少为n次,例如x{3,}能够与xxx或者xxxx等匹配 a{n,m} 指定a出现的次数至少为n到m次。 () 用于将正则表达式分组,知足第一组正则表达式的字符串会被存储在变量$1中,以此类推。若是括号中的不是正则表达式,例如(perishable)?press 将可以匹配有或者没有perishable前缀的press ^ 位于行首。注意:和中括号中的[^]意义不一样。 $ 位于行末 ? 例如 monzas? 会匹配 monza 或者 monzas,而 mon(za)? 会匹配 mon 或者 monza。又如 x? 会匹配“空字符” 或者 一个x ! 逻辑非。例如“!string” 将会匹配除了“string”之外的全部字符串 . 表示任意字符串 - 命令Apache“不要”重写URL,例如“xxx.domain.com.* – [F]” + 匹配至少一个任意字符,例如G+匹配以G开头、而且后面至少有一个字符的字符串 * 匹配零个或多个字符,例如“.*”匹配任意字符串 | 逻辑“或”,与[OR]不一样的是,它只匹配字符串,例如(x|y)匹配x或者y \ 转义字符。能够转义左括号( 尖字符^ 美圆符号$ 感叹号! 点. 星号* 管道符号| 右括号) 等 \. 转义为点字符(点字符在正则表达式中能够匹配任意字符) /* 零个或多个正斜杠 .* 零个或多个任意字符(即,匹配任意字符串,包括空字符) ^$ 匹配“空字符”、“空行” ^.*$ 匹配任意字符串(仅限一行) [^/.] 匹配既非“正斜杠”也不是“点”的任意字符 [^/.]+ 匹配第一个字符既非“正斜杠”也不是“点”,后继字符能够是“正斜杠”或者“点”的字符串 http:// 匹配“http://” ^domain.* 匹配以“domain”开始的字符串 ^domain\.com$ 仅匹配“domain.com” -d 测试字符串是不是已存在的目录 -f 测试字符串是不是已存在的文件 -s 测试字符串所指文件是否有“非零”值 HTTP协议重定向编码 301 – Moved Permanently 302 – Moved Temporarily 403 – Forbidden 404 – Not Found 410 – Gone