闲来无事,注册了三个域名(kitaluft.com, 0x97.com, jourman.com),可个人博客只有一个,于是在刚开始的时候,都是随意地把三个域名都指向该空间,也没有做任何设置,所以访问某些目录的时候,文件列表都是可见的。后来只指定一个网址“blog.kitaluft.com”,其它都通过apache2转发到该网址,这种办法倒是极简单的,只需在配置文件中加"Redirect / http://blog.kitaluft.com"就可以。 但这样的话,明显存在一个问题,假如说我有篇文章被百度收录,且地址为“http://www.kitaluft.com/id=8?”,做了以上转发后,点击该链接,是不会转到该文章的。而301跳转,就能解决以上问题。
借用网友“http://www.admin5.com/article/20140717/552719.shtml”一句话,301跳转有两种实现方法:
1.当a.com跳转到b.com 打开a.com/1.html也跳转到b.com
2.当a.com跳转到b.com 打开a.com/1.html跳转到b.com/1.html
很明显,第二种方法比较有优势。本文讲述如何访问“www.kitaluft.com”跳转到“blog.kitaluft.com”。过程中需修改配置文件为之前为该博客写的虚拟主机配置。原文本内容为:
<VirtualHost *:80>
ServerAdmin [email protected]
ServerName www.kitaluft.com
Redirect / #显性转发
ErrorLog ${APACHE_LOG_DIR}/error.log
LogLevel warn
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
修改为:
<VirtualHost *:80>
ServerAdmin [email protected]
ServerName www.kitaluft.com
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www.kitaluft.com
RewriteRule ^(.*)$ http://beyan.me/$1 [R=permanent,L]
ErrorLog ${APACHE_LOG_DIR}/error.log
LogLevel warn
CustomLog ${APACHE_LOG_DIR}/access.log combined </VirtualHost>
开启apache2重写模块
# cd /etc/apache2/mods-enabled
# ln -s ../mods-available/rewrite.load ./
设置目录权限
<Directory /var/www/>
Options FollowSymLinks MultiViews # 原来有Indexes,访问某目录时会索引该目录下文件,即列出该目录下所有文件
AllowOverride None
DirectoryIndex login.php index.php
Order allow,deny # 先允许再禁止,类似于黑名单,全部允许,个别禁止
allow from all
Deny from 183.60.243.234 # 禁止某一IP访问网站,该ip一天内攻击37次,建议站长都列为黑名单
</Directory>
设置文件权限
<Files test.html>
Order allow,deny # 拒绝该网站任何目录下该文件的访问
Deny from all
</Files>
设置网络空间权限
<Location /test>
Order Allow,Deny
Deny from all
</Location>
将拒绝任何以/test开头的URL的访问如:
http://www.kitaluft.com/test
http://www.kitaluft.com/test/abc.html
http://www.kitaluft.com/test/test/abc.html
关于目录权限,参考自:http://www.php100.com/html/webkaifa/apache/2009/0418/1193.html
后记:
笔者做了301重定向,生效后的网址有两个斜杠,例如:“http://beyan.me//”虽说不影响实际功能,便肯定是哪出了问题,大量百度谷歌之后,得出如下经验。
1、下列行中,^(.*)$和其它正则表达式所表达的一样,意思是除换行符之外的包括空行或者任意字符的行。
2、如果取掉第二个参数中的“http:// ”,浏览器地址栏中会出现死循环。
3、删掉$前面的“/”,就可以防止出现两个“//”的错误,大概是因为“$1”这个变量本身就以“/”开头。
4、“[R=permanent,L]”变量中不能有空格,否则apache2服务会报错。
5、“[NC]”表示忽略大小写。
RewriteCond %{HTTP_HOST} ^ [NC]
RewriteRule ^(.*)$ http://beyan.me/$1 [R=permanent,L]