使用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上面提供的論壇服務了。

發佈了35 篇原創文章 · 獲贊 6 · 訪問量 26萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章