»

实用.htaccess用法举例

    网站建设  
七牛cookiesHTTP标头缓存建站web.configCDN的问题服务器变量网站优化又拍云CDN访客数据库插件浏览器前端Apachehtaccess百度云加速工作wordpressIIS爬虫网络安全Wp Super CacheWordPress插件

这几天在捣鼓 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

  1. RewriteEngine on
  2. RewriteCond %{HTTP_HOST} ^example\.com [NC]
  3. RewriteRule ^(.*)$ http://www.example.com/$1 [L,R=301,NC]

强制 www 通用方法

  1. RewriteCond %{HTTP_HOST} !^$
  2. RewriteCond %{HTTP_HOST} !^www\. [NC]
  3. RewriteCond %{HTTPS}s ^on(s)|
  4. 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

  1. RewriteEngine on
  2. RewriteCond %{HTTP_HOST} ^www\.example\.com [NC]
  3. RewriteRule ^(.*)$ http://example.com/$1 [L,R=301]

强制 non-www通用方法

  1. RewriteEngine on
  2. RewriteCond %{HTTP_HOST} ^www\.
  3. RewriteCond %{HTTPS}s ^on(s)|off
  4. RewriteCond http%1://%{HTTP_HOST} ^(https?://)(www\.)?(.+)$
  5. RewriteRule ^ %1%3%{REQUEST_URI} [R=301,L]

强制 HTTPS

  1. RewriteEngine on
  2. RewriteCond %{HTTPS} !on
  3. RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
  4.  
  5. # Note: It's also recommended to enable HTTP Strict Transport Security (HSTS)
  6. on your HTTPS website to help prevent man-in-the-middle attacks.
  7. # See https://developer.mozilla.org/en-US/docs/Web/Security/HTTP_strict_transport_security
  8. <IfModule mod_headers.c>
  9.     Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
  10. </IfModule>

强制 HTTPS 通过代理

如果你使用了代理,这种方法对你很有用。

  1. RewriteCond %{HTTP:X-Forwarded-Proto} !https
  2. RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}

强制添加末尾斜杠

  1. RewriteCond %{REQUEST_URI} /+[^\.]+$
  2. RewriteRule ^(.+[^/])$ %{REQUEST_URI}/ [R=301,L]

去掉末尾斜杠

  1. RewriteCond %{REQUEST_FILENAME} !-d
  2. RewriteRule ^(.*)/$ /$1 [R=301,L]

重定向到一个页面

  1. Redirect 301 /oldpage.html http://www.example.com/newpage.html
  2. Redirect 301 /oldpage2.html http://www.example.com/folder/

目录别名

  1. RewriteEngine On
  2. RewriteRule ^source-directory/(.*) target-directory/$1

脚本别名

本文禁止全文转载。任何形式转载请联系作者(时光在路上 www.timezls.com) Copyright © 2023. All Rights Reserved

本文禁止全文转载。任何形式转载请联系作者(时光在路上 www.timezls.com) Copyright © 2023. All Rights Reserved

  1. FallbackResource /index.fcgi

重定向整个网站

  1. Redirect 301 / http://newsite.com/

干净的URL

例如,用 example.com/users 替代 example.com/users.php

  1. RewriteEngine On
  2. RewriteCond %{SCRIPT_FILENAME} !-d
  3. RewriteRule ^([^.]+)$ $1.php [NC,L]

拒绝所有访问

  1. ## Apache 2.2
  2. Deny from all
  3.  
  4. ## Apache 2.4
  5. # Require all denied

把自己也禁止访问了可不好,因此使用排除,如下一条

拒绝所有访问(排除部分)

  1. ## Apache 2.2
  2. Order deny,allow
  3. Deny from all
  4. Allow from xxx.xxx.xxx.xxx
  5.  
  6. ## Apache 2.4
  7. # Require all denied
  8. # Require ip xxx.xxx.xxx.xxx

xxx.xxx.xxx.xxx 是你的IP地址。关于IP地址,我会专门写一篇文章。

屏蔽爬虫/恶意访问

  1. ## Apache 2.2
  2. Order deny,allow
  3. Allow from all
  4. Deny from xxx.xxx.xxx.xxx
  5. Deny from xxx.xxx.xxx.xxy
  6.  
  7. ## Apache 2.4
  8. # Require all granted
  9. # Require not ip xxx.xxx.xxx.xxx
  10. # Require not ip xxx.xxx.xxx.xxy

保护隐藏文件和目录

  1. RewriteCond %{SCRIPT_FILENAME} -d [OR]
  2. RewriteCond %{SCRIPT_FILENAME} -f
  3. RewriteRule "(^|/)\." - [F]

当然,你也可以用 RedirectMatch 404 /\..*$

本文禁止全文转载。任何形式转载请联系作者(时光在路上 www.timezls.com) Copyright © 2023. All Rights Reserved

本文禁止全文转载。任何形式转载请联系作者(时光在路上 www.timezls.com) Copyright © 2023. All Rights Reserved

保护备份文件和源代码文件

  1. <FilesMatch "(\.(bak|config|dist|fla|inc|ini|log|psd|sh|sql|swp)|~)$">
  2.     ## Apache 2.2
  3.     Order allow,deny
  4.     Deny from all
  5.     Satisfy All
  6.  
  7.     ## Apache 2.4
  8.     # Require all denied
  9. </FilesMatch>

禁止目录浏览

Options All -Indexes

禁止图片盗链

  1. RewriteEngine on
  2. # Remove the following line if you want to block blank referrer too
  3. RewriteCond %{HTTP_REFERER} !^$
  4.  
  5. RewriteCond %{HTTP_REFERER} !^http(s)?://(.+\.)?example.com [NC]
  6. RewriteRule \.(jpg|jpeg|png|gif|bmp)$ - [NC,F,L]
  7.  
  8. # If you want to display a "blocked" banner in place of the hotlinked image,
  9. replace the above rule with:
  10. # RewriteRule \.(jpg|jpeg|png|gif|bmp) http://example.com/blocked.png [R,L]

禁止图片盗链(指定域名)

本文禁止全文转载。任何形式转载请联系作者(时光在路上 www.timezls.com) Copyright © 2023. All Rights Reserved

  1. RewriteEngine on
  2. RewriteCond %{HTTP_REFERER} ^http(s)?://(.+\.)?badsite\.com [NC,OR]
  3. RewriteCond %{HTTP_REFERER} ^http(s)?://(.+\.)?badsite2\.com [NC,OR]
  4. RewriteRule \.(jpg|jpeg|png|gif)$ - [NC,F,L]
  5.  
  6. # If you want to display a "blocked" banner in place of the hotlinked image,
  7. replace the above rule with:
  8. # RewriteRule \.(jpg|jpeg|png|gif|bmp) http://example.com/blocked.png [R,L]

密码保护目录

首先你需要创建密码文件 .htpasswd

htpasswd -c /home/fellowship/.htpasswd

之后使用如下代码:

  1. AuthType Basic
  2. AuthName "One does not simply"
  3. AuthUserFile /home/fellowship/.htpasswd
  4. Require valid-user

密码保护文件

本文禁止无授权转载 - 时光在路上 www.timezls.com 保留所有权利

  1. AuthName "One still does not simply"
  2. AuthType Basic
  3. AuthUserFile /home/fellowship/.htpasswd
  4.  
  5. <Files "one-ring.o">
  6. Require valid-user
  7. </Files>
  8.  
  9. <FilesMatch ^((one|two|three)-rings?\.o)$>
  10. Require valid-user
  11. </FilesMatch>

通过 Referrer 过滤访客

  1. RewriteEngine on
  2. # Options +FollowSymlinks
  3. RewriteCond %{HTTP_REFERER} somedomain\.com [NC,OR]
  4. RewriteCond %{HTTP_REFERER} anotherdomain\.com
  5. RewriteRule .* - [F]

防止被别的网页嵌套

  1. SetEnvIf Request_URI "/starry-night" allow_framing=true
  2. Header set X-Frame-Options SAMEORIGIN env=!allow_framing

压缩文件

  1. <IfModule mod_deflate.c>
  2.  
  3.     # 强制 compression for mangled headers.
  4.     # http://developer.yahoo.com/blogs/ydn/posts/2010/12/pushing-beyond-gzipping
  5.     <IfModule mod_setenvif.c>
  6.         <IfModule mod_headers.c>
  7.             SetEnvIfNoCase ^(Accept-EncodXng|X-cept-Encoding|X{15}|~{15}|-{15})$ ^((gzip|deflate)\s*,?\s*)+|[X~-]{4,13}$ HAVE_Accept-Encoding
  8.             RequestHeader append Accept-Encoding "gzip,deflate" env=HAVE_Accept-Encoding
  9.         </IfModule>
  10.     </IfModule>
  11.  
  12.     # Compress all output labeled with one of the following MIME-types
  13.     # (for Apache versions below 2.3.7, you don't need to enable `mod_filter`
  14.     #  and can remove the `<IfModule mod_filter.c>` and `</IfModule>` lines
  15.     #  as `AddOutputFilterByType` is still in the core directives).
  16.     <IfModule mod_filter.c>
  17.         AddOutputFilterByType DEFLATE application/atom+xml \
  18.                                       application/javascript \
  19.                                       application/json \
  20.                                       application/rss+xml \
  21.                                       application/vnd.ms-fontobject \
  22.                                       application/x-font-ttf \
  23.                                       application/x-web-app-manifest+json \
  24.                                       application/xhtml+xml \
  25.                                       application/xml \
  26.                                       font/opentype \
  27.                                       image/svg+xml \
  28.                                       image/x-icon \
  29.                                       text/css \
  30.                                       text/html \
  31.                                       text/plain \
  32.                                       text/x-component \
  33.                                       text/xml
  34.     </IfModule>
  35.  
  36. </IfModule>

 

设置过期头信息

本文禁止无授权转载 - 时光在路上 www.timezls.com 保留所有权利

  1. <IfModule mod_expires.c>
  2.     ExpiresActive on
  3.     ExpiresDefault                                      "access plus 1 month"
  4.  
  5.   # CSS
  6.     ExpiresByType text/css                              "access plus 1 year"
  7.  
  8.   # Data interchange
  9.     ExpiresByType application/json                      "access plus 0 seconds"
  10.     ExpiresByType application/xml                       "access plus 0 seconds"
  11.     ExpiresByType text/xml                              "access plus 0 seconds"
  12.  
  13.   # Favicon (cannot be renamed!)
  14.     ExpiresByType image/x-icon                          "access plus 1 week"
  15.  
  16.   # HTML components (HTCs)
  17.     ExpiresByType text/x-component                      "access plus 1 month"
  18.  
  19.   # HTML
  20.     ExpiresByType text/html                             "access plus 0 seconds"
  21.  
  22.   # JavaScript
  23.     ExpiresByType application/javascript                "access plus 1 year"
  24.  
  25.   # Manifest files
  26.     ExpiresByType application/x-web-app-manifest+json   "access plus 0 seconds"
  27.     ExpiresByType text/cache-manifest                   "access plus 0 seconds"
  28.  
  29.   # Media
  30.     ExpiresByType audio/ogg                             "access plus 1 month"
  31.     ExpiresByType image/gif                             "access plus 1 month"
  32.     ExpiresByType image/jpeg                            "access plus 1 month"
  33.     ExpiresByType image/png                             "access plus 1 month"
  34.     ExpiresByType video/mp4                             "access plus 1 month"
  35.     ExpiresByType video/ogg                             "access plus 1 month"
  36.     ExpiresByType video/webm                            "access plus 1 month"
  37.  
  38.   # Web feeds
  39.     ExpiresByType application/atom+xml                  "access plus 1 hour"
  40.     ExpiresByType application/rss+xml                   "access plus 1 hour"
  41.  
  42.   # Web fonts
  43.     ExpiresByType application/font-woff2                "access plus 1 month"
  44.     ExpiresByType application/font-woff                 "access plus 1 month"
  45.     ExpiresByType application/vnd.ms-fontobject         "access plus 1 month"
  46.     ExpiresByType application/x-font-ttf                "access plus 1 month"
  47.     ExpiresByType font/opentype                         "access plus 1 month"
  48.     ExpiresByType image/svg+xml                         "access plus 1 month"
  49. </IfModule>

 

关闭 eTags 标志

  1. <IfModule mod_headers.c>
  2.     Header unset ETag
  3. </IfModule>
  4. FileETag None

设置 PHP 变量

 
  1. php_value <key> <val>
  2.  
  3. For example:
  4. php_value upload_max_filesize 50M
  5. php_value max_execution_time 240

自定义错误页面

  1. ErrorDocument 500 "Houston, we have a problem."
  2. ErrorDocument 401 http://error.example.com/mordor.html
  3. ErrorDocument 404 /errors/halflife3.html

强制下载

本文禁止无授权转载 - 时光在路上 www.timezls.com 保留所有权利

 
  1. <Files *.md>
  2.     ForceType application/octet-stream
  3.     Header set Content-Disposition attachment
  4. </Files>

阻止下载

  1. <FilesMatch "\.(tex|log|aux)$">
  2.     Header set Content-Type text/plain
  3. </FilesMatch>

运行跨域字体引用

 
  1. <IfModule mod_headers.c>
  2.     <FilesMatch "\.(eot|otf|ttc|ttf|woff|woff2)$">
  3.         Header set Access-Control-Allow-Origin "*"
  4.     </FilesMatch>
  5. </IfModule>

自动 UTF-8 编码格式

  1. # Use UTF-8 encoding for anything served text/plain or text/html
  2. AddDefaultCharset utf-8
  3.  
  4. # 强制 UTF-8 for a number of file formats
  5. AddCharset utf-8 .atom .css .js .json .rss .vtt .xml

切换 PHP 版本

  1. AddHandler application/x-httpd-php55 .php
  2.  
  3. # Alternatively, you can use AddType
  4. AddType application/x-httpd-php55 .php

禁止IE兼容视图

  1. <IfModule mod_headers.c>
  2.     BrowserMatch MSIE is-msie
  3.     Header set X-UA-Compatible IE=edge env=is-msie
  4. </IfModule>

支持 WebP 图片格式

  1. RewriteEngine On
  2. RewriteCond %{HTTP_ACCEPT} image/webp
  3. RewriteCond %{DOCUMENT_ROOT}/$1.webp -f
  4. RewriteRule (.+)\.(jpe?g|png)$ $1.webp [T=image/webp,E=accept:1]
时光在路上扫码阅读、分享
  • 版权声明:该文章由 时光在路上 发表,共 12281字。除非特别标注来源,否则为原创。详见《版权声明》部分。
  • 转载请注明:文章标题和文章链接 - 时光在路上 - 也可直接“复制本文链接” 或 使用右边二维码分享本文 →