标签归档:.htaccess

.htaccess 常用功能技巧

1. 定制目录的 Index 文件

1 DirectoryIndex index.html index.php index.htm

你可以使用上面的配置来更改目录的默认页面,例如你将这个脚本放在 foo 目录,则用户请求 /foo/ 时候就会访问 /foo/index.html

2. 自定义错误页

ErrorDocument 404 errors/404.html

当用户访问页面报错时,例如页面找不到你希望显示自定义的错误页面,你可以通过这种方法来实现。或者是动态的页面:

1 ErrorDocument 404 /psych/cgi-bin/error/error?404

3 控制访问文件和目录的级别

经常用来限制和拒绝访问某个文件和目录,例如我们有一个 includes 文件夹,这里存放一些脚本,我们不希望用户直接访问这个文件夹,那么通过下面的脚本可以实现:

# no one gets in here!  deny from all

上述脚本是拒绝所有的访问,你也可以根据IP段来拒绝:

# no nasty crackers in here!  order deny,allow    
deny from all    
allow from 192.168.0.0/24 # this would do the same thing..  #allow from 192.168.0

一般这些方法是通过防火墙来处理,但在一个生产环境中的服务器来说,这样的调整非常方便。

有时候你只是想禁止某个ip访问:

1 # someone else giving the ruskies a bad name..  2 order allow,deny 3 deny from 83.222.23.219 4 allow from all

4. 修改环境变量

环境变量包含了服务器端 CGI 的一些扩展信息,可使用 SetEnvUnSetEnv 进行设置以及取消设置.

SetEnv SITE_WEBMASTER "Jack Sprat" SetEnv SITE_WEBMASTER_URI mailto:Jack.Sprat@characterology.com    

UnSetEnv REMOTE_ADDR

5. 301 重定向

如果你希望某个页面跳转到新的页面:

Redirect 301 /old/file.html http://yourdomain.com/new/file.html

下面可以实现对整个路径的重定向

RedirectMatch 301 /blog(.*) http://yourdomain.com/$1

6. 通过 .htaccess 实现缓存策略

通过设置在浏览器上缓存静态文件可以提升网站的性能:

# year  <FilesMatch "\.(ico|pdf|flv|jpg|jpeg|png|gif|swf|mp3|mp4)$"> Header set Cache-Control "public" Header set Expires "Thu, 15 Apr 2010 20:00:00 GMT" Header unset Last-Modified </FilesMatch> #2 hours  <FilesMatch "\.(html|htm|xml|txt|xsl)$"> Header set Cache-Control "max-age=7200, must-revalidate"    
</FilesMatch>    
<FilesMatch "\.(js|css)$"> SetOutputFilter DEFLATE Header set Expires "Thu, 15 Apr 2010 20:00:00 GMT"    
</FilesMatch>

7. 使用 GZIP 对输出进行压缩

在 .htaccess 中添加下面的代码可以将所有的 css、js 和 html 使用 GZIP 算法压缩:

<IfModule mod_gzip.c> mod_gzip_on       Yes    
    mod_gzip_dechunk  Yes    
    mod_gzip_item_include file \.(html?|txt|css|js|php|pl)$    
    mod_gzip_item_include handler ^cgi-script$    
    mod_gzip_item_include mime ^text/.* mod_gzip_item_include mime ^application/x-javascript.* mod_gzip_item_exclude mime ^image/.* mod_gzip_item_exclude rspheader ^Content-Encoding:.*gzip.*    
</IfModule>

使用上面代码的前提是启用 mod_gzip 模块,你可以使用下面脚本来判断 Web 服务器是否提供 mod_deflate 支持:

<Location> SetOutputFilter DEFLATE    
      SetEnvIfNoCase Request_URI  \    
        \.(?:gif|jpe?g|png)$ no-gzip dont-vary    
    SetEnvIfNoCase Request_URI  \    
        \.(?:exe|t?gz|zip|gz2|sit|rar)$ no-gzip dont-vary </Location>

如果 Web 服务器不支持 mod_deflate ,那么可使用下面方法:

<FilesMatch "\.(txt|html|htm|php)"> php_value output_handler ob_gzhandler </FilesMatch>

8. 强制要求使用 HTTPS 访问

通过以下脚本可以强制整个网站必须使用 https 方式访问:

RewriteEngine On    
RewriteCond %{HTTPS} !on    
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}

9. URL 重写

例如要将 product.php?id=12 重写为 product-12.html

RewriteEngine on    
RewriteRule ^product-([0-9]+)\.html$ product.php?id=$1

将 product.php?id=12 重写为 product/ipod-nano/12.html

RewriteEngine on    
RewriteRule ^product/([a-zA-Z0-9_-]+)/([0-9]+)\.html$ product.php?id=$2

重定向没有 www 到有 www 的 URL 地址:

RewriteEngine On    
RewriteCond %{HTTP_HOST} ^viralpatel\.net$    
RewriteRule (.*) http://www.viralpatel.net/$1 [R=301,L]

 

重写 yoursite.com/user.php?username=xyz 到 yoursite.com/xyz

RewriteEngine On    
RewriteRule ^([a-zA-Z0-9_-]+)$ user.php?username=$1 RewriteRule ^([a-zA-Z0-9_-]+)/$ user.php?username=$1

 

 

重定向某个域名到一个 public_html 里新的子文件夹

RewriteEngine On    
RewriteCond %{HTTP_HOST} ^test\.com$ [OR]    
RewriteCond %{HTTP_HOST} ^www\.test\.com$    
RewriteCond %{REQUEST_URI} !^/new/ RewriteRule (.*) /new/$1

 10. 阻止列出目录文件

使用下面代码可以防止列表目录里的所有文件:

Options -Indexes

或者

IndexIgnore *

11. 添加新的 MIME-Types

MIME-types 依赖于文件的扩展名,未能被识别的文件扩展名会当成文本数据传输

AddType application/x-endnote-connection enz    
AddType application/x-endnote-filter enf    
AddType application/x-spss-savefile sav

12. 防盗链

你不希望别人网站引用你站内的图片、css 等静态文件,也就是传说中的防盗链,可以使用如下脚本:

RewriteCond %{HTTP_REFERER} !^$    
RewriteCond %{REQUEST_URI} !^/(wp-login.php|wp-admin/|wp-content/plugins/|wp-includes/).* [NC]    
RewriteCond %{HTTP_REFERER} !^http://www.askapache.com.*$ [NC]  RewriteRule \.(ico|pdf|flv|jpg|jpeg|mp3|mpg|mp4|mov|wav|wmv|png|gif|swf|css|js)$ - [F,NS,L]

13. 指定上传文件的大小限制,适用于 PHP

php_value upload_max_filesize 20M    
php_value post_max_size 20M    
php_value max_execution_time 200 php_value max_input_time 200

上述脚本中,通过四个参数来设置上传文件的限制,第一个参数是文件的大小,第二个是 POST 数据的大小,第三个是传输的时间(单位秒),最后一个是解析上传数据最多花费的时间(单位秒)

14. 禁止脚本执行

Options -ExecCGI    
AddHandler cgi-script .php .pl .py .jsp .asp .htm .shtml .sh .cgi

15. 修改字符集和语言头

AddDefaultCharset UTF-8 DefaultLanguage en-US

16. 设置服务器时区(GMT)

SetEnv TZ America/Indianapolis

17. 强制 “File Save As” 提示

AddType application/octet-stream .avi .mpg .mov .pdf .xls .mp4

18. 保护单个文件

正常情况下 .htaccess 可用于限制整个目录的访问,但也可以只限制某个文件

 1 <Files quiz.html>  2 order deny,allow  3 deny from all  4 AuthType Basic  5 AuthName "Characterology Student Authcate"  6 AuthLDAP on  7 AuthLDAPServer ldap://directory.characterology.com/   8 AuthLDAPBase "ou=Student, o=Characterology University, c=au"  9 require valid-user 10 satisfy any 11 </Files>

19. 设置 Cookie

通过环境变量来设置 Cookie

Header set Set-Cookie "language=%{lang}e; path=/;" env=lang

基于请求设置 Cookie,该代码发送 Set-Cookie 头用于设置 Cookie 值为第二个括号里的匹配项

RewriteEngine On    
RewriteBase / RewriteRule ^(.*)(de|es|fr|it|ja|ru|en)/$ - [co=lang:$2:.yourserver.com:7200:/]

20. 设置自定义的响应 Headers

Header set P3P "policyref=\"http://www.askapache.com/w3c/p3p.xml\"" Header set X-Pingback "http://www.askapache.com/xmlrpc.php" Header set Content-Language "en-US" Header set Vary "Accept-Encoding"

21. 根据 User-Agent 来阻止请求

SetEnvIfNoCase ^User-Agent$ .*(craftbot|download|extract|stripper|sucker|ninja|clshttp|webspider|leacher|collector|grabber|webpictures) HTTP_SAFE_BADBOT    
SetEnvIfNoCase ^User-Agent$ .*(libwww-perl|aesop_com_spiderman) HTTP_SAFE_BADBOT    
Deny from env=HTTP_SAFE_BADBOT

.htaccess设置指南 怎么支持.htaccess

需要

httpd.conf:
LoadModule rewrite_module libexec/apache2/mod_rewrite.so

LINUX 在安装APACHE 的时候需要将 mod_rewrite.so  编译进去

配置

启动rewirite
RewriteEngine on

支持.htaccess
AllowOverride All

现在国内的很多空间都不支持。即使是LINUX 空间。。。呵呵。无论从哪里来看,国内和国外差距确实还真大

.htaccess设置指南

会降低APACHE的性能,除非你对目录权限要求很高或需要做UrlRewrite,否则不推荐你使用.

如果你的服务器目录结构是这样:

/usr/corsak/wwwroot/www/maindir

如果Apache指令中开启了AllowOverride支持.htaccess文件,每访问一次会依次搜索:

/usr/corsak/wwwroot/www/maindir/.htaccess
/usr/corsak/wwwroot/www/.htaccess
/usr/corsak/wwwroot/.htaccess

    Apache指南: .htaccess文件 

.htaccess文件提供了针对目录改变配置的方法。 

  * .htaccess文件 
  * 工作原理和使用方法 
  * 使用.htaccess文件的场合 
  * 指令的生效 
  * 认证举例 
  * 服务器端包含举例 
  * CGI举例 
  * 疑难解答 

top 
.htaccess文件 
相关模块     相关指令 

  * core 
  * mod_auth 
  * mod_cgi 
  * mod_include 
  * mod_mime 

  * AccessFileName 
  * AllowOverride 
  * Options 
  * AddHandler 
  * SetHandler 
  * AuthType 
  * AuthName 
  * AuthUserFile 
  * AuthGroupFile 
  * Require 

top 
工作原理和使用方法 

.htaccess文件(或者"分布式配置文件"提供了针对目录改变配置的方法, 即,在一个特定的文档目录中放置一个包含一个或多个指令的文件, 以作用于此目录及其所有子目录。 

说明:如果需要使用.htaccess以外的其他文件名,可以用AccessFileName指令来改变。 例如,需要使用.config,则可以在服务器配置文件中按以下方法配置: 

AccessFileName .config 

允许放在这些文件中的指令取决于AllowOverride指令, 此指令按类别决定了.htaccess文件中哪些指令才是有效的。 如果一个指令允许放在.htaccess文件中,则,在本手册的说明中,此指令会有一个覆盖段, 其中说明了为使此指令生效而必须在AllowOverride指令中设置的值。 

例如,本手册对AddDefaultCharset指令的说明表明了, 此指令可以用于.htaccess文件(见 Context一行),而Override一行是"FileInfo", 那么为使.htaccess中的此指令有效,则至少要设置"AllowOverride FileInfo"。 
例子: 
Context:     server config, virtual host, directory, .htaccess 
Override:     FileInfo 

如果不能确定一个特定的指令是否允许用于.htaccess文件, 可以查阅手册中对指令的说明,看在Context(“上下文”)行中是否有".htaccess."。 
top 
使用.htaccess文件的场合 

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

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

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

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

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

还有,Apache必须在所有更高级的目录中查找.htaccess文件, 使所有有效的指令都起作用(参见how directives are applied.),所以, 如果有对/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 
top 
指令的生效 

.htaccess文件中的配置指令作用于.htaccess文件所在的目录及其所有子目录, 但是,很重要需要记住的是,其更高级的目录也可能会有.htaccess文件, 而指令是按查找顺序依次生效,所以, 一个特定目录下的.htaccess文件中的指令可能会覆盖其更高级目录中的 .htaccess文件的指令,即, 子目录中的指令会覆盖更高级目录或者主服务器配置文件中的指令。 

例如: 

目录/www/htdocs/example1中的.htaccess文件有如下内容: 

Options +ExecCGI 

(注意: 必须设置"AllowOverride Options"以允许在.htaccess文件中使用 "Options"指令。) 

在目录/www/htdocs/example1/example2中的.htaccess文件有如下内容: 

Options Includes 

由于第二个.htaccess文件的存在,/www/htdocs/example1/example2中 的CGI执行是不允许的,而只允许Options Includes,它完全覆盖了之前的设置。 
top 
认证举例 

如果你为了知道如何认证,直接从这里开始看,有很重要的