这几天在捣鼓 Apache 主机,各种参数配置,而使用最多的就是 .htaccess 文件。看到一篇文章,写得挺全的,下面把它的一些配置举例列举出来,供大家参考。
.htaccess 是什么?
.htaccess 文件(或者"分布式配置文件")提供了针对目录改变配置的方法, 即,在一个特定的文档目录中放置一个包含一个或多个指令的文件, 以作用于此目录及其所有子目录。作为用户,所能使用的命令受到限制。管理员可以通过 Apache 的 AllowOverride 指令来设置。
概述来说,htaccess 文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置。通过 .htaccess 文件,可以帮我们实现:网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能。
启用.htaccess,需要修改httpd.conf,启用 AllowOverride,并可以用 AllowOverride 限制特定命令的使用。如果需要使用 .htaccess以外的其他文件名,可以用 AccessFileName 指令来改变。例如,需要使用.config ,则可以在服务器配置文件中按以下方法配置:AccessFileName .config 。
笼统地说,.htaccess 可以帮我们实现包括:文件夹密码保护、用户自动重定向、自定义错误页面、改变你的文件扩展名、封禁特定IP地址的用户、只允许特定IP地址的用户、禁止目录列表,以及使用其他文件作为 index 文件等一些功能。
工作原理
.htaccess 文件(或者"分布式配置文件")提供了针对每个目录改变配置的方法,即在一个特定的目录中放置一个包含指令的文件,其中的指令作用于此目录及其所有子目录。
本文禁止住转载。任何形式转载请联系作者(时光在路上 www.timezls.com)。时光在路上保留所有权利
说明:
如果需要使用 .htaccess 以外的其他文件名,可以用 AccessFileName 指令来改变。例如,需要使用 .config ,则可以在服务器配置文件中按以下方法配置:
AccessFileName .config
本文禁止住转载。任何形式转载请联系作者(时光在路上 www.timezls.com)。时光在路上保留所有权利
通常,.htaccess文件使用的配置语法和主配置文件一样。AllowOverride指令按类别决定了 .htaccess 文件中哪些指令才是有效的。如果一个指令允许在 .htaccess 中使用,那么在本手册的说明中,此指令会有一个覆盖项段,其中说明了为使此指令生效而必须在 AllowOverride 指令中设置的值。
关于 .htaccess 文件的场合
一般情况下,不应该使用 .htaccess 文件,除非你对主配置文件没有访问权限。有一种很常见的误解,认为用户认证只能通过 .htaccess 文件实现,其实并不是这样,把用户认证写在主配置文件中是完全可行的,而且是一种很好的方法。
.htaccess 文件应该被用在内容提供者需要针对特定目录改变服务器的配置而又没有root权限的情况下。如果服务器管理员不愿意频繁修改配置,则可以允许用户通过 .htaccess 文件自己修改配置,尤其是ISP在同一个机器上运行了多个用户站点,而又希望用户可以自己改变配置的情况下。
虽然如此,一般都应该尽可能地避免使用 .htaccess 文件。任何希望放在 .htaccess 文件中的配置,都可以放在主配置文件的 <Directory> 段中,而且更高效。
本文禁止全文转载。任何形式转载请联系作者(时光在路上 www.timezls.com) Copyright © 2023. All Rights Reserved
避免使用 .htaccess 文件有两个主要原因
首先是性能。如果 AllowOverride 启用了 .htaccess文 件,则 Apache 需要在每个目录中查找 .htaccess 文件,因此,无论是否真正用到,启用 .htaccess 都会导致性能的下降。另外,对每一个请求,都需要读取一次 .htaccess 文件。
还有,Apache 必须在所有上级的目录中查找 .htaccess 文件,以使所有有效的指令都起作用,所以,如果请求 /www/htdocs/example
中的页面,Apache 必须查找以下文件:
本文禁止无授权转载 - 时光在路上 www.timezls.com 保留所有权利
/.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 文件的内容:
AddType text/example .exm
httpd.conf文件中摘录的内容:
<Directory /www/htdocs/example>
AddType text/example .exm
</Directory>
但是,把配置放在主配置文件中更加高效,因为只需要在Apache启动时读取一次,而不是在每次文件被请求时都读取。
将 AllowOverride 设置为 none 可以完全禁止使用 .htaccess 文件:AllowOverride None
本文禁止全文转载。任何形式转载请联系作者(时光在路上 www.timezls.com) Copyright © 2023. All Rights Reserved
指令的作用范围
.htaccess 文件中的配置指令作用于 .htaccess 文件所在的目录及其所有子目录,但是很重要的、需要注意的是,其上级目录也可能会有 .htaccess 文件,而指令是按查找顺序依次生效的,所以一个特定目录下的 .htaccess 文件中的指令可能会覆盖其上级目录中的 .htaccess 文件中的指令,即子目录中的指令会覆盖父目录或者主配置文件中的指令。
疑难解答
如果在 .htaccess 文件中的某些指令不起作用,可能有多种原因。
本文禁止全文转载。任何形式转载请联系作者(时光在路上 www.timezls.com) Copyright © 2023. All Rights Reserved
最常见的原因是 AllowOverride 指令没有被正确设置,必须确保没有对此文件区域设置 AllowOverride None 。有一个很好的测试方法,就是在 .htaccess 文件随便增加点无意义的垃圾内容,如果服务器没有返回了一个错误消息,那么几乎可以断定设置了 AllowOverride None 。
在访问文档时,如果收到服务器的出错消息,应该检查Apache的错误日志,可以知道.htaccess文件中哪些指令是不允许使用的,也可能会发现需要纠正的语法错误。
本文禁止全文转载。任何形式转载请联系作者(时光在路上 www.timezls.com) Copyright © 2023. All Rights Reserved
.htaccess 工具
不会写的朋友,在这介绍一款很不错 .htaccess 的重定向—URL重写工具 rewriting-tool 。
.htaccess 命令设置举例
重新和重定向
注意:首先需要服务器安装和启用 mod_rewrite 模块。
强制 www
- RewriteEngine on
- RewriteCond %{HTTP_HOST} ^example\.com [NC]
- RewriteRule ^(.*)$ http://www.example.com/$1 [L,R=301,NC]
强制 www 通用方法
- RewriteCond %{HTTP_HOST} !^$
- RewriteCond %{HTTP_HOST} !^www\. [NC]
- RewriteCond %{HTTPS}s ^on(s)|
- RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
这种方法可以使用在任何网站中。
强制 non-www
本文禁止全文转载。任何形式转载请联系作者(时光在路上 www.timezls.com) Copyright © 2023. All Rights Reserved
究竟是 WWW好,还是 non-www好,没有定论,如果你喜欢不带 www 的,可以使用下面的脚本:
本文禁止全文转载。任何形式转载请联系作者(时光在路上 www.timezls.com) Copyright © 2023. All Rights Reserved
- RewriteEngine on
- RewriteCond %{HTTP_HOST} ^www\.example\.com [NC]
- RewriteRule ^(.*)$ http://example.com/$1 [L,R=301]
强制 non-www通用方法
- RewriteEngine on
- RewriteCond %{HTTP_HOST} ^www\.
- RewriteCond %{HTTPS}s ^on(s)|off
- RewriteCond http%1://%{HTTP_HOST} ^(https?://)(www\.)?(.+)$
- RewriteRule ^ %1%3%{REQUEST_URI} [R=301,L]
强制 HTTPS
- RewriteEngine on
- RewriteCond %{HTTPS} !on
- RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
- # Note: It's also recommended to enable HTTP Strict Transport Security (HSTS)
- # on your HTTPS website to help prevent man-in-the-middle attacks.
- # See https://developer.mozilla.org/en-US/docs/Web/Security/HTTP_strict_transport_security
- <IfModule mod_headers.c>
- Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
- </IfModule>
强制 HTTPS 通过代理
如果你使用了代理,这种方法对你很有用。
- RewriteCond %{HTTP:X-Forwarded-Proto} !https
- RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
强制添加末尾斜杠
- RewriteCond %{REQUEST_URI} /+[^\.]+$
- RewriteRule ^(.+[^/])$ %{REQUEST_URI}/ [R=301,L]
去掉末尾斜杠
- RewriteCond %{REQUEST_FILENAME} !-d
- RewriteRule ^(.*)/$ /$1 [R=301,L]
重定向到一个页面
- Redirect 301 /oldpage.html http://www.example.com/newpage.html
- Redirect 301 /oldpage2.html http://www.example.com/folder/
目录别名
- RewriteEngine On
- RewriteRule ^source-directory/(.*) target-directory/$1
脚本别名
本文禁止全文转载。任何形式转载请联系作者(时光在路上 www.timezls.com) Copyright © 2023. All Rights Reserved
本文禁止全文转载。任何形式转载请联系作者(时光在路上 www.timezls.com) Copyright © 2023. All Rights Reserved
- FallbackResource /index.fcgi
重定向整个网站
- Redirect 301 / http://newsite.com/
干净的URL
例如,用 example.com/users
替代 example.com/users.php
- RewriteEngine On
- RewriteCond %{SCRIPT_FILENAME} !-d
- RewriteRule ^([^.]+)$ $1.php [NC,L]
拒绝所有访问
- ## Apache 2.2
- Deny from all
- ## Apache 2.4
- # Require all denied
把自己也禁止访问了可不好,因此使用排除,如下一条
拒绝所有访问(排除部分)
- ## Apache 2.2
- Order deny,allow
- Deny from all
- Allow from xxx.xxx.xxx.xxx
- ## Apache 2.4
- # Require all denied
- # Require ip xxx.xxx.xxx.xxx
xxx.xxx.xxx.xxx 是你的IP地址。关于IP地址,我会专门写一篇文章。
屏蔽爬虫/恶意访问
- ## Apache 2.2
- Order deny,allow
- Allow from all
- Deny from xxx.xxx.xxx.xxx
- Deny from xxx.xxx.xxx.xxy
- ## Apache 2.4
- # Require all granted
- # Require not ip xxx.xxx.xxx.xxx
- # Require not ip xxx.xxx.xxx.xxy
保护隐藏文件和目录
- RewriteCond %{SCRIPT_FILENAME} -d [OR]
- RewriteCond %{SCRIPT_FILENAME} -f
- RewriteRule "(^|/)\." - [F]
当然,你也可以用 RedirectMatch 404 /\..*$
本文禁止全文转载。任何形式转载请联系作者(时光在路上 www.timezls.com) Copyright © 2023. All Rights Reserved
本文禁止全文转载。任何形式转载请联系作者(时光在路上 www.timezls.com) Copyright © 2023. All Rights Reserved
保护备份文件和源代码文件
- <FilesMatch "(\.(bak|config|dist|fla|inc|ini|log|psd|sh|sql|swp)|~)$">
- ## Apache 2.2
- Order allow,deny
- Deny from all
- Satisfy All
- ## Apache 2.4
- # Require all denied
- </FilesMatch>
禁止目录浏览
Options All -Indexes
禁止图片盗链
- RewriteEngine on
- # Remove the following line if you want to block blank referrer too
- RewriteCond %{HTTP_REFERER} !^$
- RewriteCond %{HTTP_REFERER} !^http(s)?://(.+\.)?example.com [NC]
- RewriteRule \.(jpg|jpeg|png|gif|bmp)$ - [NC,F,L]
- # If you want to display a "blocked" banner in place of the hotlinked image,
- # replace the above rule with:
- # RewriteRule \.(jpg|jpeg|png|gif|bmp) http://example.com/blocked.png [R,L]
禁止图片盗链(指定域名)
本文禁止全文转载。任何形式转载请联系作者(时光在路上 www.timezls.com) Copyright © 2023. All Rights Reserved
- RewriteEngine on
- RewriteCond %{HTTP_REFERER} ^http(s)?://(.+\.)?badsite\.com [NC,OR]
- RewriteCond %{HTTP_REFERER} ^http(s)?://(.+\.)?badsite2\.com [NC,OR]
- RewriteRule \.(jpg|jpeg|png|gif)$ - [NC,F,L]
- # If you want to display a "blocked" banner in place of the hotlinked image,
- # replace the above rule with:
- # RewriteRule \.(jpg|jpeg|png|gif|bmp) http://example.com/blocked.png [R,L]
密码保护目录
首先你需要创建密码文件 .htpasswd
:
htpasswd -c /home/fellowship/.htpasswd
之后使用如下代码:
- AuthType Basic
- AuthName "One does not simply"
- AuthUserFile /home/fellowship/.htpasswd
- Require valid-user
密码保护文件
本文禁止无授权转载 - 时光在路上 www.timezls.com 保留所有权利
- AuthName "One still does not simply"
- AuthType Basic
- AuthUserFile /home/fellowship/.htpasswd
- <Files "one-ring.o">
- Require valid-user
- </Files>
- <FilesMatch ^((one|two|three)-rings?\.o)$>
- Require valid-user
- </FilesMatch>
通过 Referrer 过滤访客
- RewriteEngine on
- # Options +FollowSymlinks
- RewriteCond %{HTTP_REFERER} somedomain\.com [NC,OR]
- RewriteCond %{HTTP_REFERER} anotherdomain\.com
- RewriteRule .* - [F]
防止被别的网页嵌套
- SetEnvIf Request_URI "/starry-night" allow_framing=true
- Header set X-Frame-Options SAMEORIGIN env=!allow_framing
压缩文件
- <IfModule mod_deflate.c>
- # 强制 compression for mangled headers.
- # http://developer.yahoo.com/blogs/ydn/posts/2010/12/pushing-beyond-gzipping
- <IfModule mod_setenvif.c>
- <IfModule mod_headers.c>
- SetEnvIfNoCase ^(Accept-EncodXng|X-cept-Encoding|X{15}|~{15}|-{15})$ ^((gzip|deflate)\s*,?\s*)+|[X~-]{4,13}$ HAVE_Accept-Encoding
- RequestHeader append Accept-Encoding "gzip,deflate" env=HAVE_Accept-Encoding
- </IfModule>
- </IfModule>
- # Compress all output labeled with one of the following MIME-types
- # (for Apache versions below 2.3.7, you don't need to enable `mod_filter`
- # and can remove the `<IfModule mod_filter.c>` and `</IfModule>` lines
- # as `AddOutputFilterByType` is still in the core directives).
- <IfModule mod_filter.c>
- AddOutputFilterByType DEFLATE application/atom+xml \
- application/javascript \
- application/json \
- application/rss+xml \
- application/vnd.ms-fontobject \
- application/x-font-ttf \
- application/x-web-app-manifest+json \
- application/xhtml+xml \
- application/xml \
- font/opentype \
- image/svg+xml \
- image/x-icon \
- text/css \
- text/html \
- text/plain \
- text/x-component \
- text/xml
- </IfModule>
- </IfModule>
设置过期头信息
本文禁止无授权转载 - 时光在路上 www.timezls.com 保留所有权利
- <IfModule mod_expires.c>
- ExpiresActive on
- ExpiresDefault "access plus 1 month"
- # CSS
- ExpiresByType text/css "access plus 1 year"
- # Data interchange
- ExpiresByType application/json "access plus 0 seconds"
- ExpiresByType application/xml "access plus 0 seconds"
- ExpiresByType text/xml "access plus 0 seconds"
- # Favicon (cannot be renamed!)
- ExpiresByType image/x-icon "access plus 1 week"
- # HTML components (HTCs)
- ExpiresByType text/x-component "access plus 1 month"
- # HTML
- ExpiresByType text/html "access plus 0 seconds"
- # JavaScript
- ExpiresByType application/javascript "access plus 1 year"
- # Manifest files
- ExpiresByType application/x-web-app-manifest+json "access plus 0 seconds"
- ExpiresByType text/cache-manifest "access plus 0 seconds"
- # Media
- ExpiresByType audio/ogg "access plus 1 month"
- ExpiresByType image/gif "access plus 1 month"
- ExpiresByType image/jpeg "access plus 1 month"
- ExpiresByType image/png "access plus 1 month"
- ExpiresByType video/mp4 "access plus 1 month"
- ExpiresByType video/ogg "access plus 1 month"
- ExpiresByType video/webm "access plus 1 month"
- # Web feeds
- ExpiresByType application/atom+xml "access plus 1 hour"
- ExpiresByType application/rss+xml "access plus 1 hour"
- # Web fonts
- ExpiresByType application/font-woff2 "access plus 1 month"
- ExpiresByType application/font-woff "access plus 1 month"
- ExpiresByType application/vnd.ms-fontobject "access plus 1 month"
- ExpiresByType application/x-font-ttf "access plus 1 month"
- ExpiresByType font/opentype "access plus 1 month"
- ExpiresByType image/svg+xml "access plus 1 month"
- </IfModule>
关闭 eTags 标志
- <IfModule mod_headers.c>
- Header unset ETag
- </IfModule>
- FileETag None
设置 PHP 变量
- php_value <key> <val>
- # For example:
- php_value upload_max_filesize 50M
- php_value max_execution_time 240
自定义错误页面
- ErrorDocument 500 "Houston, we have a problem."
- ErrorDocument 401 http://error.example.com/mordor.html
- ErrorDocument 404 /errors/halflife3.html
强制下载
本文禁止无授权转载 - 时光在路上 www.timezls.com 保留所有权利
- <Files *.md>
- ForceType application/octet-stream
- Header set Content-Disposition attachment
- </Files>
阻止下载
- <FilesMatch "\.(tex|log|aux)$">
- Header set Content-Type text/plain
- </FilesMatch>
运行跨域字体引用
- <IfModule mod_headers.c>
- <FilesMatch "\.(eot|otf|ttc|ttf|woff|woff2)$">
- Header set Access-Control-Allow-Origin "*"
- </FilesMatch>
- </IfModule>
自动 UTF-8 编码格式
- # Use UTF-8 encoding for anything served text/plain or text/html
- AddDefaultCharset utf-8
- # 强制 UTF-8 for a number of file formats
- AddCharset utf-8 .atom .css .js .json .rss .vtt .xml
切换 PHP 版本
- AddHandler application/x-httpd-php55 .php
- # Alternatively, you can use AddType
- AddType application/x-httpd-php55 .php
禁止IE兼容视图
- <IfModule mod_headers.c>
- BrowserMatch MSIE is-msie
- Header set X-UA-Compatible IE=edge env=is-msie
- </IfModule>
支持 WebP 图片格式
- RewriteEngine On
- RewriteCond %{HTTP_ACCEPT} image/webp
- RewriteCond %{DOCUMENT_ROOT}/$1.webp -f
- RewriteRule (.+)\.(jpe?g|png)$ $1.webp [T=image/webp,E=accept:1]