Wordpress的.htaccess设定

Clloz · · 69次浏览 ·

前言

我的博客的web服务用用的apache,对于网站,我们有很多文件不希望被访问,特别是有些目录会在被用户访问以后显示index就是文件的索引,web服务器可以帮我们配置我们想要的功能,下面就来分享一下我的.htaccess的设置。

.htaccess

.htaccess是apache的分布式配置文件,提供了仅针对所在目录的改变配置的方法,会作用于所有子目录,可以帮我们实现如网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能。apache的配置文件是在/etc/httpd/conf/httpd.conf,修改这个文件会作用于所有通过web服务器访问的文件,为了配置的灵活,我们还是在自己的网站所在目录进行配置比较好,只要在我们网站根目录创建.htaccess文件就可以了。

需要的功能

禁止目录浏览

apache默认是开启目录浏览的,就是当我们访问网站的一些文件夹时,由于没有路由定向,会显示一个Index of /wp-content的页面,显示访问的文件夹下的文件列表,这是非常不安全的,我们不希望被用户看到我们网站下所有的文件。

directory-browsing

使用下面的配置,禁用当前目录的index

# Disable directory browsing
Options All -Indexes

IP黑名单

这个功能用来禁止一些你想拉黑的IP访问你的网站,我没有使用,不过如果你要用的话用下面的方法配置:

# Block one or more IP address.
# Replace IP_ADDRESS_* with the IP you want to block

<Limit GET POST>
order allow,deny
deny from IP_ADDRESS_1
deny from IP_ADDRESS_2
allow from all
</Limit>

其中的IP_ADDRESS_1就是用来存放你要禁止的IP

禁止用户访问wp-includes

wp-includeswordpress的核心文件所在,并且所有的插件和主题也不会访问该文件夹,所以我们应该禁止所有用户访问这个文件夹,用正则表达式来Rewrite,让访问wp-includes的请求直接rewrite403

# Block wp-includes folder and files
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^wp-admin/includes/ - [F,L]
RewriteRule !^wp-includes/ - [S=3]
RewriteRule ^wp-includes/[^/]+\.php$ - [F,L]
RewriteRule ^wp-includes/js/tinymce/langs/.+\.php - [F,L]
RewriteRule ^wp-includes/theme-compat/ - [F,L]
</IfModule>

RewriteRule后面的第一个参数是匹配请求url的正则表达式,-后面的是flagF表示将url重写到403L表示最后一条,就跟switch case中的break差不多,匹配成功就不会执行下面的了。

仅允许选定的IP访问wp-admin

这个功能我没有使用,也就是只有配置中的IP才能访问后台,如果你有需要可以用如下配置

# Limit logins and admin by IP
<Limit GET POST PUT>
order deny,allow
deny from all
allow from your-ip
allow from IP_ADDRESS_2
</Limit>

只允许访问wp-content中特定类型的文件

我们也不希望用户访问wp-content中的文件,但是由于wp-content中有插件和主题所需要的一些样式文件等等,如果我们禁止了一切请求,那么我们在后台操作的时候会发现界面一团糟,一些插件的功能无法使用了,因为它们没法访问到wp-content中的文件,所以一个折中的办法是,我们只允许一些固定类型的文件可以被访问,比如css,js等。需要注意的是,下面的配置要在wp-content文件夹中新建一个.htaccess,如果你还想写在根目录下的文件中,记得加上路径。

# Disable access to all file types except the following
Order deny,allow
Deny from all
<Files ~ ".(xml|css|js|jpe?g|png|gif|pdf|docx|rtf|odf|zip|rar)$">
Allow from all
</Files>

拒绝用户访问wp-config.php和.htaccess

wp-config.php包含了你的数据库用户名密码等非常敏感的信息,所以我们应该禁止任何人访问这个文件。

# Deny access to wp-config.php file
<files wp-config.php>
order allow,deny
deny from all
</files>

至于.htaccess文件apache在自己的配置文件中似乎已经禁止了,如果你不放心,把下面的配置加到你的文件中。

# Deny access to all .htaccess files
<files ~ "^.*\.([Hh][Tt][Aa])">
order allow,deny
deny from all
satisfy all
</files>

重定向到https以及自定义错误页面

我的网站开启了https所以我把所有的请求重定向到80端口了;如果你把错误页面弄漂亮一点,自己上传一个,然后添加到配置中去,配置如下:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://www.clloz.com/$1 [R=301,L]
ErrorDocument 403 /403.html
ErrorDocument 404 /404.html
ErrorDocument 500 /500.html
ErrorDocument 503 /503.html
</IfModule>

wordpress会重制你的.htaccess

这个问题我在另一篇文章里面已经写过,这里再说一下,当你在后台点击设置中的固定链接时,wordpress会重制.htaccess中的一部分,当你编辑.htaccess的时候应该已经发现了,有几行代码原来就在其中,被# BEGIN WordPress # END WordPress包裹的部分,就是这部分会被重制,所以你自己的配置就不要写到这中间去了,否则一不小心就被重置了。

总结

虽然我们的个人博客可能并没有很多人访问,也不太会有人特意攻击,但是做好安全工作是一个好的习惯,也是不错的经验。如果你使用nginxgoogle一下吧,我一直也想把web服务器换nginx不过一直没时间折腾,等有闲暇了在搞。

参考文章

Best .htaccess Snippets to Improve WordPress Security


Clloz

人生をやり直す

发表评论

电子邮件地址不会被公开。 必填项已用*标注

我不是机器人*

EA PLAYER &

历史记录 [ 注意:部分数据仅限于当前浏览器 ]清空

      00:00/00:00