怎样使用.htaccess控制URL

2016年1月26日 | 分类: 【技术】

【介绍】

Apache模块 mod_rewrite 提供了一个基于正则表达式分析器的重写引擎来实时重写URL请求。它支持每个完整规则可以拥有不限数量的子规则以及附加条件规则的灵活而且强大的URL操作机制。

此模块可以操作URL的所有部分(包括路径信息部分),在服务器级的(httpd.conf)和目录级的(.htaccess)配置都有效,还可以生成最终请求字符串。此重写操作的结果可以是内部子处理,也可以是外部请求的转向,甚至还可以是内部代理处理。

参考:http://httpd.apache.org/docs/current/howto/htaccess
参考:http://baike.baidu.com/view/91163.htm
参考:http://hi.baidu.com/wojiubaibudu/item/4b3513c74a8fe47aced4f817
参考:http://www.8ttt8.com/jishu/w6533.htm

【需求】

将指定文件的.php后缀换成.html:

参考:http://www.bkjia.com/xtzh/834330.html

RewriteEngine on
RewriteRule ^/?test\.html$ test.php [L]

将所有文件的.php后缀换成.html:

RewriteEngine on
RewriteRule ^/?([a-zA-Z0-9]+)\.html$ $1.php [L]

将所有文件的.php后缀省略:

RewriteEngine on
RewriteRule ^/?([a-z]+)$ $1.php [L]

识别浏览器的语言重定向不同的链接:

参考:http://cn.iseopad.com/htaccess-browser-lang-20130711/
参考:http://stackoverflow.com/questions/12184543/htaccess-redirect-only-if-the-http-referrer-does-not-equal-something
参考:http://www.cnblogs.com/antarctican/p/3772684
参考:http://pastebin.com/kxsfE9ga

是使用程序去判断用的语言再去跳转,或者在程序内根据用户语言输出不同的内容。

RewriteCond %{HTTP:Accept-Language} ^zh-cn.*$ [NC,OR]
RewriteCond %{HTTP:Accept-Language} ^zh.*$ [NC]
RewriteCond %{HTTP:Accept-Language} ^zh [NC]
RewriteCond %{HTTP_HOST} ^example\.com$ [NC]
RewriteRule ^(.*)$ http://ch.example.com/$1 [L,R=301]

强制URL不使用WWW和https:

RewriteEngine on
RewriteBase /
RewriteCond %{HTTP_HOST} !^amon.org [NC]
RewriteRule ^(.*)$ http://amon.org/$1 [L,R=301]
RewriteCond %{SERVER_PORT} !^443$
RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI} [L,R]

通过 .htaccess 和 .htpasswd 的组合对程序目录进行保护:

这样可以在PHPMyAdmin使用root账号密码登录之外增加一层密码,同时搜索引擎的爬虫也无法觇知PHPMyAdmin目录的所在。

在线工具:https://whoisdog.com/tool/htpasswd-generator/

加密算法:
1. plain (Windows & TPF servers)
2. Crypt (all Unix servers)
3. MD5 (Apache servers only)
4. SHA-1 (Netscape-LDIF / Apache servers)

比如账号:aaa,密码:bbb。

因为在Linux服务器上使用,这里选用MD5加密,生成:

aaa:$apr1$35H3DKDK$QS3oD/roJgsINe/naD8gf.

编辑 .htpasswd 文件:

aaa:$apr1$35H3DKDK$QS3oD/roJgsINe/naD8gf.

编辑 .htaccess 文件:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{SERVER_PORT} !^443$
RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI} [L,R]
</IfModule>

AuthName "Access"
AuthType Basic
AuthUserFile "/usr/local/apache2/htdocs/phpmyadmin/.htpasswd"
require valid-user

注意:AuthUserFile 这里 .htpasswd 的路径只能是绝对路径。

把 .htaccess和.htpasswd 放置在PHPMyAdmin目录下,即可保护目录。

参考:http://www.cnblogs.com/mutuan/archive/2012/07/27/2611537

参考:自动创建源码htprotector

下载:https://sourceforge.net/projects/htprotector/
步骤:
1. 下载程序压缩包,解压 htprotector.php 到需要密码保护的目录下;
2. 将需要密码保护的目录设置权限为777;
3. Web访问 htprotector.php 程序,设置用户名、密码、重复密码、邮箱,即可生成.htaccess和.htpasswd ;
4. 移除htprotector.php。