# .htaccess配置

请注意

.htaccess文件在网站的根目录下,文件的全名就是.htaccess,以点开头,结尾没有文件后缀,请不要加.txt之类的后缀。

# apache版本

云虚拟主机当前使用的httpd版本为Server version: Apache/2.2.34 (Unix),请参考这个版本的官方文档。

# output_buffering

# 说明

output_buffering是PHP的一个设置,如果开启,则PHP在执行过程中产生的HTML文件将分片多次发送给浏览器,如果开启了,则在脚本执行结束后一起发送。

# 默认值

当前设置默认是开启的,开启的大小为4096bytes

# 开启的优势

  • 减少HTML下载和渲染的时间
  • 可以在脚本执行结束后对整个HTML文件做处理

# 从.htaccess文件中开启

从.htaccess文件添加如下的内容即可:

php_value output_buffering 4096

# 从.htaccess文件中关闭

从.htaccess文件添加如下的内容即可:

php_value output_buffering off

# 从管理面板操作

从高级设置功能“高级设置”处即可设置是否开启。

设置output-buffering选项

# display_errors

# 说明

display_errors是PHP提供的功能,可以让你的错误在访问的HTML中显示。

关于error_reporting(0)

如果从程序中设置了error_reporting(0);则所有的日志输出都会被忽略,不会输出也不会记录错误日志,因此请尽量避免使用。

# 默认值

php.ini的默认设置为display_errors = Off,默认不展示错误。

# 从.htaccess文件中开启错误显示

可以从根目录下的.htaccess文件添加如下的内容开启错误显示:

php_value display_errors 1

# 从.htaccess文件中关闭错误显示

可以从根目录下的.htaccess文件添加如下的内容关闭错误显示:

php_value display_errors 0

# 从管理面板设置

从高级设置功能“高级设置”处即可设置是否开启。

设置错误显示选项

# 列目录Indexes

# 说明

列目录是Apache服务器提供的功能,可以在访问某个链接时在没有默认的首页文件时列出这个目录下的所有文件。

# 默认值

默认为关闭状态,访问为403HTTP code,如下图所示:

没有默认首页时展示403错误

# 从.htaccess开启

可以从根目录下的.htaccess文件添加如下的内容开启功能:

Options +Indexes 

开启后的效果如下:

开启列目录

提示

开启错误可能会导致网站的敏感信息泄露,非特殊场景下请不要开启这个特性。

# 从.htaccess关闭

可以从根目录下的.htaccess文件添加如下的内容关闭功能:

Options -Indexes 

关闭时访问为403HTTP code,如下图所示:

没有默认首页时展示403错误

# 从管理平台设置

管理中心支持一键开启或者关闭列目录功能,从高级设置功能“高级设置”处可以完成设置:

设置是否开启或者关闭列目录

# 默认首页配置

# 说明

默认首页文件功能是Apache服务提供的功能,提供了访问一个目录时默认首页的文件顺序,当前系统设置的默认的文件顺序为:

DirectoryIndex index.html index.htm index.php sinacloudindex.html sinacloudindex.php 

这个配置的意思时,当一个请求到达一个实际存在的目录时,apache服务器将按从index.html到sinacloudindex.php的顺序去找这些文件,找到某个文件就结束。

如果以上所有的文件都没有,就看“列目录”的参数设定:

  • 如果开启了列目录,则列出目录下所有的文件列表到页面
  • 如果关闭了列目录功能,则返回403错误

# 从.htaccess文件中设置

从根目录下的.htaccess文件中可以设置如下的内容:

DirectoryIndex default.html index.html index.php sinacloudindex.html sinacloudindex.php 

如果按上面的内容设定,如果目录下又default.html文件,则优先使用这个文件当作首页,否则继续往下寻找index.html文件,以此类推。

# 从管理面板设置

云虚拟主机的管理面板支持在线设置默认首页及默认首页的优先级,从高级设置功能“默认首页设置”处可以完成设置:

在线设置优先级

# 自定义错误页面

# 说明

自定义错误页面是Apache服务提供的功能,允许设定系统出错时的错误展示页面。

# 默认值

系统默认没有设置错误页面,将使用系统默认的错误页面,例如403的错误页面如下:

没有默认首页时展示403错误

# 从.htaccess文件中设置

从根目录下加一个403.html的页面,内容如下:

<h1>403 error!</h1>

从.htaccess文件中设置如下内容添加403的错误自定义页面:

ErrorDocument 403 /403.html 

访问403页面就会变成如下:

新的403错误页面

请注意

403的状态码不会被改变,如上图所示。

# 从管理面板设置

云虚拟主机的管理面板支持在线设置自定义错误错误,从高级设置功能“自定义错误页面”处可以完成设置:

在线设置403错误页面

# 302跳转配置

# 功能说明

302跳转是Apache设置的功能,允许设置将满足条件的请求从URL A重定向到URL B。

# 从.htaccess文件中设置

从根目录下的.htaccess文件中设置以下内容,可以将所有访问smtcdn.com域名的请求,302跳转到www.smtcdn.com下。

RewriteEngine on
rewritecond %{http_host} ^smtcdn.com [nc]
rewriterule ^(.*)$ http://www.smtcdn.com/$1 [r=302,nc] 

从命令行验证访问http://smtcdn.com 可以看到:

验证302请求

服务端已经返回了302状态码,Location的地址为http://www.smtcdn.com/

# 从管理面板设置

从应用的管理中心左侧导航选择“高级设置”,选择“302跳转配置”功能,点击“+新增302跳转规则”:

在线设置302跳转

# 301跳转配置

301跳转是Apache设置的功能,允许设置将满足条件的请求从URL A重定向到URL B。

# 从.htaccess文件中设置

从根目录下的.htaccess文件中设置以下内容,可以将所有访问smtcdn.com域名的请求,301跳转到www.smtcdn.com下。

RewriteEngine on
rewritecond %{http_host} ^smtcdn.com [nc]
rewriterule ^(.*)$ http://www.smtcdn.com/$1 [r=301,nc] 

从命令行验证访问http://smtcdn.com 可以看到:

验证301请求

服务端已经返回了301状态码,Location的地址为http://www.smtcdn.com/

# 从管理面板设置

管理面板提供在线编辑.htaccess的功能。

从应用的管理中心左侧导航选择“高级设置”,选择“高级设置”功能,点击“编辑.htaccess”处的编辑,贴上301跳转的.htaccess规则,保存即可。

编辑.htaccess内容

# 常见跳转状态码的区别

常见的HTTP状态码有301、302、303、307。

# 301

永久跳转,对此资源发出后续请求的客户端应使用新URI(应该记住),客户端不应该自动遵循POST / PUT / DELETE请求的重定向。

# 302

因为未知的原因需要重定向,对此资源发出后续请求的客户端不应使用新URI,客户端不应该自动遵循POST / PUT / DELETE请求的重定向。

# 303

因为未知的原因需要重定向,通常的意义为:“操作已经完成,需要去其他的URI继续”。对此资源发出后续请求的客户端不应使用新URI,客户端应遵循POST / PUT / DELETE请求的重定向,但使用GET作为后续请求。

# 307

临时重定向,资源可能稍后返回此位置,对此资源发出后续请求的客户端应使用旧URI,客户端不应自动遵循POST / PUT / DELETE请求的重定向。

提示

如果用于临时重定向,建议使用307状态码。

# 常见的.htaccess配置

提示

将以下的示例.htaccess规则放到根目录下的.htaccess文件中即可。

# 将所有的动态请求都转发到index.php处理

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^.*$ /index.php [L,QSA] 

以下为演示的内容,请不要直接拷贝代码到实际业务中。

演示的index.php内容为:

<?php
var_dump($_REQUEST); 

访问链接https://www.smtcdn.com/cccc.php?a=1可以看到输出为:

array(2) { ["a"]=> string(1) "1" ["DokuWiki"]=> string(32) "3aa401a0ac3705e5001c90cc7f2f06f8" }  
测试rewrite的内容

实际没有ccc.php文件,根据rewrite的规则请求将被重定向到index.php处理,其中参数 a参数是URL中带过去的,DokuWikicookie中的内容。

# 强制使用https访问

在.htaccess文件中配置以下规则,然后所以的HTTP请求重定向到HTTPS:

RewriteEngine on  
RewriteCond %{HTTP:X-FORWARDED-PROTO} !^https$  
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=307] 

访问HTTP的资源,可以看到已经返回了307的HTTP状态码,重定向的地址到了HTTPS的地址:

HTTP的地址重定向到HTTPS的地址

# 配置basic认证

.htaccess文件内容为:

<FilesMatch "(abc)$">  
     Deny from all
</Filesmatch>  
AuthType Basic  
AuthName "RestrictedFiles"  
AuthBasicProvider file  
AuthUserFile /abc  
Require valid-user   

还需要在根目录下添加一个名称为abc的文件用于存储basic认证的用户名和密码,abc文件的内容为:

admin:k6VPsWmhxCSIE 

以上的用户名密码都是admin,文件内容可以从http://tool.oschina.net/htpasswd生成,其中加密的算法请选择Crypt (all Unix servers)

访问时,浏览器会弹出需要输入用户名和密码的框,如下所示:

HTTP basic认证的弹框

直接访问/abc文件可以看到,访问被系统拦截了,返回了403错误,如图:

HTTP 403错误

# 保护某个目录

如果配置文件或者一些敏感信息需要配置为只能从代码中读取,不能从HTTP访问时,需要配置保护某个目录,例如需要保护/test/目录。

.htaccess的文件内容如下:

SetEnvIf Request_URI "(test/)" deny
Order deny,allow
Deny from env=deny
Satisfy any 

设置保护前:

设置保护前

设置保护后,所有/test/下的所有的路径都返回403错误:

设置保护后