1. 程式人生 > >使用apache的rewrite功能實現內部重定向

使用apache的rewrite功能實現內部重定向

  • 場景:實驗室有一臺機器(稱為nat_server吧)擁有外網地址,在另外一臺內部伺服器上提供web服務(稱之為web_server),我們想讓外網的使用者能夠通過nat_server能夠訪問web_server。
  • 實現方案
    1. 使用iptables的snat,dnat功能
    2. 使用ipfilter的map功能
    3. 使用apache的rewrite功能
  • 優缺點:
    • 方法1和2的是通過埠轉發的功能來實現的,對使用者端有要求,比如說我需要通過 http://nat_server:8080 的方式來訪問web_server,而且有可能受上級路由器開啟埠的限制,如果上級路由器不允許使用8080埠的話,那就必須換另外一個埠了。我配置了半天沒有弄成功,鬱悶的是,還不知道是什麼原因。
    • 方法3是我推薦的,因為我們原本就在nat_server上開了httpd服務,使用這種方式我可以通過 http://nat_server/to_web_server 的方式來訪問內網伺服器
  • 實現細節

  這裡給出我對兩種方案的配置,我使用了iptables來實現埠重發,加入的規則如下

iptables -A INPUT -p tcp --dport 8080 -j ACCEPT
iptables -A FORWARD -p tcp --destination-port 80 --destination 10.20.10.204 -j ACCEPT
iptables -t nat -A PREROUTING -d 1.2.3.4

-p tcp -m tcp --dport 80 -j DNAT --to-destination 10.20.10.204:80
iptables -t nat -A POSTROUTING -s 10.20.10.0/8 -d 10.20.10.204 -p tcp -m tcp --dport 80 -j SNAT --to-source 10.20.10.208

不知道什麼原因,我的這個配置沒有成功,以後再解決它。

對於apche的重寫規則,其實也是比較容易的,需要修改如下地方:
在這裡我們假定
DocumentRoot "/var/www/html"
ServerRoot "/etc/httpd"

1) /etc/httpd/conf/httpd.conf 檔案

# 載入 rewrite 模組
LoadModule rewrite_module modules/mod_rewrite.so
<Directory />
# 允許符號連線和覆蓋,否則rewrite不起作用
    Options FollowSymLinks
    AllowOverride All
</Directory>

<Directory "/var/www/html">
# 允許符號連線和覆蓋,否則rewrite不起作用
    Options FollowSymLinks
    AllowOverride All
    Order allow,deny
    Allow from all 
</Directory>

2) 在 /var/www/html 下新建 .htaccess 檔案,內容如下

RewriteEngine   on
RewriteBase     /
RewriteRule     ^forum$ forum/  [L]

3) 在 /var/www/html 下建立 forum 檔案加,在forum資料夾中建立 .htaccess 檔案,內容如下

RewriteEngine   on
RewriteBase     /forum/
RewriteRule     (.*) http://web_server_ip/$1 [P,L]

需要注意的是,在上面的RewriteRule當中一定要寫上 [P] 標示,表示是內部重定向, [R]表示是外部重定向。 我就是因為沒有寫上P標識,耽誤了好長時間。

然後重啟httpd服務,就可以通過 http://nat_server/forum 來訪問web_server上面提供的論壇服務了。