通过设置一台apache服务器完成对 
  https://10.6.177.66内容的访问,后来经过学习才了解,我们其实就是需要在自己的apache服务器中,创建一个https://10.6.177.66的反向代理。首先介绍一下何为反向代理:  一.反向代理的概念
   反向代理也就是通常所说的WEB服务器加速,它是一种通过在繁忙的WEB服务器和Internet之间增加一个高速的WEB缓冲服务器(即:WEB反向代理服务器)来降低实际的WEB服务器的负载。
   Web服务器加速(反向代理)是针对Web服务器提供加速功能的。它作为代理Cache,但并不针对浏览器用户,而针对一台或多台特定Web服务器(这也是反向代理名称的由来)。实施反向代理(如上图所示),只要将Reverse Proxy Cache设备放置在一台或多台Web服务器前端即可。当互联网用户访问某个WEB服务器时,通过DNS服务器解析后的IP地址是Reverse Proxy Server的IP地址,而非原始Web服务器的IP地址,这时Reverse Proxy Server设备充当Web服务器,浏览器可以与它连接,无需再直接与Web服务器相连。因此,大量Web服务工作量被卸载到反向代理服务上。不但能够防止外部网主机直接和web服务器直接通信带来的安全隐患,而且能够很大程度上减轻web服务器的负担,提高访问速度。
  二.win+apache实现ssl
   首先,到http://hunter.campbus.com/去下载和自己的apache版本相同的的Apache_xxx-xxxOpenssl_xxx-Win32.zip。
   我用的是Apache_2.0.59,
   安装程序地址: http://apache.justdn.org/httpd/binaries/win32/apache_2.0.59-win32-x86-no_ssl.msi
   Apache_2.0.59-Openssl_0.9.8c-Win32.zip地址:
   http://209.61.202.80/apache/Apache_2.0.59-Openssl_0.9.8c-Win32.zip)。
   解压缩后找到这5个文件mod_ssl.so(modules目录),ssl.conf,ssl.default.conf(conf目录, 其中default.conf作为备份),libeay32.dll, ssleay32.dll(这2个都在bin目录)。把它们全都复制到你自己的apahce下的对应目录 。 
  ############################################################################### 
   接下来,更改设置文件 
   对于httpd.conf和ssl.conf,如果你的服务器没有域名,那么servername就填ip好了。 
  比如:ServerName 172.18.42.123:80(httpd.conf) 
  ServerName 172.18.42.123:443(ssl.conf) 
   
   打开httpd.conf: 
   找到#LoadModule ssl_module modules/mod_ssl.so,去掉前面的‘#‘,这样就在启动时加载了ssl模块。 
  
   打开ssl.conf: 
  找到#;和#;,把前面的’#‘号都去掉,否则启动apache时还要加参数,麻烦。 
   如下设置: 
   SSLMutex default
   SSLCertificateFile conf/server.crt(服务器证书的位置) 
   SSLCertificateKeyFile conf/server.key (服务器私钥的位置) 
   SSLCACertificateFile conf/ca.crt (CA根证书的位置,进行客户端验证时需要)
   上面的文件被放到了conf目录下。
   DocumentRoot "xxxxx" (指向要ssl加密认证的文档目录,比如"f:/http") 
   SSLVerifyClient require (去掉前面的‘#’号,进行客户端验证时需要) 
   SSLVerifyDepth 1 (去掉前面的‘#’号,把10改为1,进行客户端验证时需要) 
  
  ############################################################################## 
   现在,就要制作证书了 
   去openvpn.net下载并安装openvpn。 
   http://openvpn.net/release/openvpn-2.0.9-install.exe
   这是一个虚拟个人网络制作工具,他能完美的在win(linux,BSD也行)下制作根、服务器、客户端证书。 
   安装完毕后,开始-程序-附件-命令提示符,进到openvpn的easy-rsa目录,比如: 
   c:\program files\openvpn\easy-rsa>
   输入: init-config 回车 
   会产生几个文件,切换出来,打开vars.bat文件,修改其中的KEY_COUNTRY(国家2位字母), KEY_PROVINCE(省2位字母), KEY_CITY(城市), KEY_ORG(组织), KEY_EMAIL(电子邮箱)这几个参数,免的后面制证时 
  
   反复输入麻烦。保存退出,继续使用命令提示符。 
   依次输入以下两个命令,当然是分别回车喽: 
   vars 
   clean-all (这两个是准备工作) 
  
  ####################################################################################
   1. 建立CA根证书 
   输入build-ca 回车(这个就是建立CA根证书啦) 
   然后显示: 
   ai:/usr/share/openvpn/easy-rsa # ./build-ca 
   Generating a 1024 bit RSA private key 
   ............++++++ 
   ...........++++++ 
   writing new private key to 'ca.key' 
   ----- 
   You are about to be asked to enter information that will be incorporated into your certificate request. 
   What you are about to enter is what is called a Distinguished Name or a DN. 
   There are quite a few fields but you can leave some blan k 
   For some fields there will be a default value, 
   If you enter '.', the field will be left blank. 
  ----- 
   Country Name (2 letter code) [KG]: 国家名2位字母,默认的参数就是我们刚才修改过的。 
   State or Province Name (full name) [NA]: 省、州名2位字母 
   Locality Name (eg, city) [BISHKEK]: 城市名 
   Organization Name (eg, company) [OpenVPN-TEST]: 组织名 
   Organizational Unit Name (eg, section) []: 组织里的单位名 
   Common Name (eg, your name or your server's hostname) []:这个是关键,应该输入颁发根证书单位的域名 
  ,不过因为是根证书,所以怎么填都无所谓。只有服务器证书才需要认真填。 
   Email Address [me@myhost.mydomain]: 电子邮箱 
  
   好了,CA根证书制作完成!在keys目录下,它的名字就叫ca.crt,CA的私钥是ca.key 
  
  
  ####################################################################### 
   2. 制作服务器证书: 
   在命令提示符下,输入 
   build-key-server server 回车 
   你会看到和上面很相似的东西,但要注意
   这里的Common Name (eg, your name or your server's hostname) []: 这个才是真正的关键。这里应该输入服务器的域名比如www.xxx.com。 
  如果没有域名,就应该填ip,与httpd.conf和ssl.conf里的设置对应, 
   ServerName 172.18.42.123:80(httpd.conf) 
   ServerName 172.18.42.123:443(ssl.conf) 
   也就是说填:172.18.42.123
  
   接下来看到 a challenge password []:填不填随便 
   an optional company name []: 填不填随便
  
   sign the certificate? [y/n] 敲y回车。用CA根证书对服务器证书签字认证。 
   1 out 1 certificate requests certified,commit? [y/n] 敲y回车,确认。 
  
   好了,建好了在keys目录下的server.crt(证书)和server.key(私钥) ####################################################################### 
   3. 制作客户端证书: 
   在命令提示符下,输入 
   build-key client1 回车 
   又是一通国家省市组织等等,comman name也是随便填的。 
   然后 :
   a challenge password []:填不填随便
   an optional company name []: 填不填随便
  
   sign the certificate? [y/n] 敲y回车。用CA根证书对客户端证书签字认证。 
   1 out 1 certificate requests certified,commit? [y/n] 敲y回车,确认。 
  
   好了,建好了在keys目录下的client1.crt(客户端证书)和client1.key(私钥) 
  
   等等, .crt的客户端证书是不能使用的,必须把它转化为.pfx格式的文件!! 
   所以,还是在命令提示符下,输入 
   openssl 回车 
   看到openssl>; 
   再输入 :
   pkcs12 -export –in keys/client1.crt -inkey keys/client1.key -out keys/client1.pfx 回车, 
   看到Enter export password:会要求你建立客户端证书的输出密码
   verifying-Enter export password再确认一遍,好了! 
  ######################################################################## 把keys目录下的ca.crt和server.crt,server.key都复制到apache的conf目录下,(ssl.conf需要) ca.key自己保留吧,找个合适的地方储存起来. 
  
  
  ######################################################################### 
   客户端安装证书 
   打开internet explorer(IE),工具-internet选项-内容-证书,点选'个人' 再点击导入,把客户端证书client1.pfx导入到个人组里(别忘了扩展名是pfx)。这里还要输入刚才建立的输出密码才能导入呢。 
   接着,点选'受信任的根证书颁发机构',点击导入,把CA根证书ca.crt导入到受信任的根证书颁发机构里。 
  #########################################################################   
    好啦,重新启动apache,打开IE, 
    在地址栏里输入https://172.18.42.123或者域名,弹出个窗口要选择个人的数字证书。 
   点选,然后确定。 
   如果服务器证书的common name填写正确的话,你就可以直接进入网站了,看到右下角的小锁头(可靠的SSL128位)。 
   如果服务器证书的common name填写不正确,就会弹出个‘安全警报’框,告诉你3条: 
   1.安全证书由信任的站点颁发 
   (如果说是由不信任的站点颁发,那就是你的ca根证书ca.crt没有导入到ie的受信任的根证书颁发机构里) 
  
   2.安全证书的日期有效 
   (这个日期缺省是10年,可以在openvpn的easy-rsa目录下的openssl.cnf里调整修改,然后重新制作一整套证书(openssl.cnf看起来像拨号网络的快捷方式,要用记事本,写字板打开修改)) 
   
   3.“安全证书上的名称无效,或者与站点名称不匹配” 
  这就是服务器证书的common name填写不正确所致,不过这也没关系,有人好像愿意这样。我是不想看到这个警告框,烦人。 
  
   即使有安全警报,你仍能进入网站,看到右下角的小锁头(可靠的SSL128位) 
  
  
  ################################# 
   最后,成功啦!用吧。 
  三.设置反向代理
   修改conf\httpd.conf文件
   先启动两个模块
   LoadModule proxy_module modules/mod_proxy.so
   LoadModule proxy_http_module modules/mod_proxy_http.so
   然后在文件最后加上
   SSLProxyEngine on 
   ProxyRequests Off
   ProxyPass / https://10.6.177.66
   ProxyPassReverse / https://10.6.177.66 
   
   ok了,重新启动apache,输入https://172.18.42.123 ,什么效果,自己试试就知道了!

 

apache做http和https反向代理

首先是库之类的环境配置,

如果是编译的,./configure附加--enable-proxy参数,把代理模块编译进来。

然后/usr/sbin/httpd -l,显示

 

Loaded Modules:

core.c

mod_access.c

mod_auth.c

mod_include.c

mod_log_config.c

mod_env.c

mod_setenvif.c

mod_proxy.c

proxy_connect.c

proxy_ftp.c

proxy_http.c

prefork.c

http_core.c

.......
带有proxy前缀的模块即表示已经启用代理。
如果是安装好的,就在配置文件http.conf里启用相应的模块

 

LoadModule proxy_module modules/mod_proxy.so

LoadModule proxy_http_module modules/mod_proxy_http.so

可以通过/usr/sbin/httpd -D DUMP_MODULES,显示

Loaded Modules:

……

proxy_module (shared)
proxy_http_module (shared)
proxy_connect_module (shared)

就可以了。

 

现在可以开始配置虚拟主机——

如:

 

<VirtualHost *:80>

ServerAdmin webmaster@dummy-host.example.com

ServerName www.b.org

ProxyRequests Off

<Proxy *>

Order deny,allow

Allow from all

</Proxy>

ProxyPass / http://127.0.0.1:9000/

ProxyPassReverse / http://127.0.0.1:9000/

</VirtualHost>

 

 

将www.b.org这个网址指向传递到htttp://127.0.0.1:9000这个地址

这样对www.b.org的访问,返回的数据将是来自http://127.0.0.1:9000

 

配置https访问,即ssl加密访问:

首先要开启apache的ssl访问能力,跟随所写配置即可。

NameVirtualHost *:443    或者    NameVirtualHost www.abc.net:443

<VirtualHost www.abc.net:443>
ServerName www.abc.net
SSLEngine on
SSLProxyEngine on
SSLCertificateFile /etc/httpd/conf/server.crt
SSLCertificateKeyFile /etc/httpd/conf/server.key

ProxyRequests Off
<Proxy *>

Order deny,allow

Allow from all

</Proxy>

ProxyPass /test https://127.0.0.1/
ProxyPassReverse /test https://127.0.0.1/
</VirtualHost>

将对https://www.abc.net/test这个网址的访问指向https://127.0.0.1/,SSLCertificateFile和SSLCertificateKeyFile分别是配置ssl时生成使用的密钥文件。

apache下开启ssl访问,即https

 

openssl Windows下已编译好的命令行程序:

http://downloads.sourceforge.net/gnuwin32/openssl-0.9.8h-1-bin.zip

 

lamp开启ssl

首先需要安装openssl和apache的ssl模块,执行:

yum install openssl mod_ssl -y

即可,接下来的配置方法和以下内容类似

 

wamp开启SSL


1.#修改httpd.conf文件

LoadModule ssl_module modules/mod_ssl.so

Include conf/extra/httpd-ssl.conf

#去掉上面两行前的"#"

2.#修改conf/extra/httpd-ssl.conf

SSLCertificateFile "D:/wamp/Apache2/bin/server.crt"

SSLCertificateKeyFile "D:/wamp/Apache2/bin/server.key"

3.#修改为你生成证书的文件位置

DocumentRoot "E:/www"  #修改 DocumentRoot的值与httpd.conf文件的DocumentRoot保持一致.

4.#解决APACHE无法启动

68:SSLMutex  "file:D:/ProgramFiles2003/wamp/wamp/Apache2/logs/ssl_mutex"

#修改为68: SSLMutex  default    

5.#把httpd-ssl.conf文件中所有的apache的路径替换为你的APACHE的路径


#到此配置文件修改完毕


二,证书生成的方法

#命令行中进入apache/bin目录下执行如下:

openssl req -config ../conf/openssl.cnf -new -out server.csr -keyout server.pem

其中openssl.cnf为apache自带的openssl配置文件,引用到该文件的完整路径

输入两次密码,随便什么密码,然后一直回车,跳过下面的输入

#签发证书

openssl rsa -in server.pem -out server.key

输入刚才制定的密码

#生成密钥文件

openssl x509 -in server.csr -out server.crt -req -signkey server.key -days 365

#生成证书文件


把  server.key,server.crt copy到conf文件夹下



重新启动APACHE

OK,恭喜你可以正常使用HTTPS来访问你的根目录了。

 

当然我们还需要ssl的虚拟主机

那就要配置虚拟主机文件,在文件中专门写一个监听443端口的虚拟主机,例如:

<VirtualHost woosau:443>
        DocumentRoot /home/ownfire/www/woosau
        ServerName woosau
        SSLEngine on
        SSLCertificateFile /etc/httpd/conf/server.crt
        SSLCertificateKeyFile /etc/httpd/conf/server.key
</VirtualHost>

因为规定主机名是woosau,所以还要写一个虚拟主机名规则

NameVirtualHost woosau:443

好了,完毕,这样就可以访问https://woosau了

 

apache mod_rewrite uri重写 http转https

一:目的

本文旨在提供如何用Apache重写规则来解决一些常见的URL重写方法的问题,通过常见的 
实例给用户一些使用重写规则的基本方法和线索。

二:为什么需要用重写规则? 
一个网站,如果是长期需要放在internet上提供服务,必定会有不断地更新和维护,如临 
时转移到其它服务器进行维护,重新组织目录结构,变换URL甚至改变到新的域名等等, 
而为了让客户不会因此受到任何影响,最好的方法就是使用Apache Rewrite Rule(重写 
规则)。

三: 重写规则的作用范围 
1) 可以使用在Apache主配置文件httpd.conf中 
2) 可以使用在httpd.conf里定义的虚拟主机配置中 
3) 可以使用在基本目录的跨越配置文件.htaccess中

四:重写规则的应用条件 
只有当用户的WEB请求最终被导向到某台WEB服务器的Apache后台,则这台WEB服务器接受 
进来的请求,根据配置文件该请求是主配置还是虚拟主机,再根据用户在浏览器中请求的 
URI来配对重写规则并且根据实际的请求路径配对.htaccess中的重写规则。最后把请求 
的内容传回给用户,该响应可能有两种:

1) 对浏览器请求内容的外部重定向(Redirect)到另一个URL。 
让浏览器再次以新的URI发出请求(R=301或者R=302,临时的或是永久的重定向) 
如:一个网站有正规的URL和别名URL,对别名URL进行重定向到正规URL,或者网站改换 
成了新的域名 
则把旧的域名重定向到新的域名(Redirect)

2) 也可能是由Apache内部子请求代理产生新的内容送回给客户[P,L] 
这是Apache内部根据重写后的URI内部通过代理模块请求内容并送回内容给客户,而客户 
端浏览器并 
不知道,浏览器中的URI不会被重写。但实际内容被Apache根据重写规则后的URI得到。 
如:在公司防火墙上运行的Apache启动这种代理重写规则,代理对内部网段上的WEB服务 
器的请求。

五:重写规则怎样工作? 
我们假定在编译Apache时已经把mod_rewrite编译成模块,确信你的httpd.conf中有 
LoadModule rewrite_module libexec/mod_rewrite.so 
并且在Addmodule中有 
Addmodule mod_rewrite.c 
则可以使用重写规则。 
当外部请求来到Apache,Apache调用重写规则中的定义来重写由用户浏览器指定请求的 
URI,最后被重写的URI如果是重定向,则送由浏览器作再一次请求;如果是代理则把重写 
后的URI交给代理模块请求最终的内容(Content),最后把内容送回给浏览器。

六: 何时使用.htaccess中的重写规则定义? 
假如你对你的的网站内容所在的服务器没有管理员权限,或者你的网站放在ISP的服务器 
上托管等等条件下,你无法改写主配置文件,然而你可以对你的WEB站点内容所在的目录 
有写权限,则你可以设置自己的.htaccess 
文件达到同样的目的。但你需要确定主配置文件中对你的网站所在的目录定义了下面的内 
容:

Options Indexes FollowSymLinks 
AllowOverride all

否则你的.htaccess不会工作。

七: 应用举例 
假定Apache被编译安装在主机192.168.1.56的/usr/local/apache/ 目录下面,我们编 
译进了重写和代理模块。

1) 隐藏Apache下的某个目录,使得对该目录的任何请求都重定向到另一个文件。

a> httpd.conf的实现方法

我们放下面的部分到/usr/local/apache/conf/httpd.conf

options Indexes followsymlinks 
allowoverride all 
rewriteengine on 
rewritebase / 
rewriterule ^(.*)$ index.html.en [R=301]

注:rewriteengine on 为重写引擎开关,如果设为off,则任何重写规则定义将不被应 
用,该开关的另一好处就是如果为了临时拿掉重写规则,则改为off再重启动Apache即 
可,不必将下面一条条的重写规则注释掉。 
rewritebase / 的作用是如果在下面的rewriterule定义中被重写后的部分(此处为文件 
名index.html.en)前面没有/,则是相对目录,相对于这个rewritebase后面的定义也就 
是/usr/local/apache/htdocs/index.html.en,否则,如果此处没有rewritebase /这 
一项,则被重写成 
http://192.168.1.56/usr/local/apache/htdocs/manual/index.html.en ,显然是 
不正确的。

不过这里我们也可以不用rewritebase / , 而改为 
rewriteengine on 
rewriterule ^(.*)$ /index.html.en [R=301] 
或者 
rewriteengine on 
rewriterule ^(.*)$ http://192.168.1.56/index.html.en [R=301]

b> .htaccess的实现方法

我们先放下面的部分到httpd.conf

options Indexes followsymlinks 
allowoverride all

然后放下面的部分到/usr/local/apache/htdocs/manual/.htaccess中 
rewriteengine on 
rewritebase / 
rewriterule ^(.*)$ index.html.en [R=301]

注:对文件.htaccess所作的任何改动不需要重启动Apache.

问:要是把这个manual目录重定向到用户jephe的自己的主目录呢? 
用下面的.htaccess方案。 
rewriteengine on 
rewritebase /~jephe/ 
rewriterule ^(.*)$ $1 [R=301]

则对manual目录下任何文件的请求被重定向到~jephe目录下相同文件的请求。

2) 转换www.username.domain.com的对于username的主页请求为 
www.domain.com/username

对于HTTP/1.1的请求包括一个Host: HTTP头,我们能用下面的规则集重写 
http://www.username.domain.com/anypath 到 /home/username/anypath

Rewriteengine on 
rewritecond %{HTTP_HOST} ^www\.[^.]+\.host\.com$ 
rewriterule ^(.+) %{HTTP_HOST}$1 [C] 
rewriterule ^www\.([^.]+)\.host\.com(.*) /home/$1$2

注: 
rewritecond 条件重写规则,当满足后面定义的条件后才会应用下面的重写规则, 
rewritecond有各种变量 
,请查阅相关文档。

3) 防火墙上的重写规则代理内部网段上服务器的请求。

NameVirtualhost 1.2.3.4

servername www.domain.com 
rewriteengine on 
proxyrequest on 
rewriterule ^/(.*)$ http://192.168.1.3/$1 [P,L]

注:当外部浏览器请求www.domain.com时被解析到IP地址1.2.3.4 ,Apache 交出 
mod_rewrite处理转换成 
http://192.168.1.3/$1后再交由代理模块mod_proxy得到内容后传送回用户的浏览器。

4) 基本预先设定的转换MAP表进行重写 rewritemap

转换www.domain.com/{countrycode}/anypath 到Map表中规定的URI,上面是虚拟主机 
中的定义

rewritelog /usr/local/apache/logs/rewrite.log 
rewriteloglevel 9

rewriteengine on 
proxyrequest on 
rewritemap sitemap txt:/usr/local/apache/conf/rewrite.map 
rewriterule ^/([^/]+)+/(.*)$ http://%{REMOTE_HOST}::$1 [C] 
rewriterule (.*)::([a-z]+)$ ${sitemap:$2|http://h.i.j.k/} [R=301,L]

文件/usr/local/apache/conf/rewrite.map的内容如下:

sg http://a.b.c.d/ 
sh http://e.f.g.h/

注: 当用户请求http://www.domain.com/sg/anypath时被重写为 
http://a.b.c.d/anypath . 
当需要调试时请用rewritelog and rewriteloglevel 9联合,9为最大即得到最多的调试 
信息 
最小为1,最小的调试信息,默认为0,没有调试信息。 
sitemap的语法是${sitemap: LookupKey | Defaultvalue} ,有些书上把$写成了%是错 
误的。