Apache 内部重定向

公司有个WEBUI项目。就是通过AJAX发出一个接口请求。然后服务器返回结果(xml格式或txt格式)。但是接口是跨域请求的。所以通过perl封装成本地请求。

接口请求如下:

http://10.12.22.220/webui/webui_data.pl?a=tstatus&r=0.3372364002279937   /xml/tstatus.xml

http://10.12.22.220/webui/ipodwebui_data.pl?a=getvolume&r=0.10869605257175863 /xml/getvolume.xml

但是每次开发的时候,为了测试方便,也为了能够造假数据,写两个url,开发的时候用本地的文件,然后提交代码时,注释掉本地的,启用http。如下。

$.ajax({   
   url: " /xml/tstatus.xml",
   //url:"http://10.12.22.220/webui/webui_data.pl?a=tstatus&r=0.3372364002279937",
   dataType: "text",
   async: false,
   success: function(data){    
    makeLine(data,i);
   }
  }); 

后来,觉得这样很烦,每次提交代码时,都要进行注释反注释操作。有时这样的接口多了。还容易漏掉。很不方便。就想有没有这样的功能,还是用http,但是这个http指向本地xml文件。于是乎想到了apache的内部重定向。


规则如下:

首先所有的规则都包在<VirtualHost IP:PORT></VirtualHost>里面

如果没有参数的话,http://ip:port/cgi/recording/cgi_recording 在apache下的httpdocs下/xml/cgi_recording.xml

RewriteRule ^/cgi/recording/cgi_recording$ /xml/cgi_recording.xml

如果有参数的话,http://ip:port/webui/vislink.pl?a=tstatus&r=0.3372364002279937", /xml/tstatus.xml

RewriteCond %{QUERY_STRING} ^a=(.+)&r=(.+)$
RewriteRule ^/webui/webui_data.pl$ /xml/%1.xml?

访问前面的url就会跳转去访问后面的本地文件。


后面的文件随便动,这样可以随便造假数据。而且不再需要2个url,提交的时候不需要再做任何改动,直接提交了。


<VirtualHost 10.12.22.220:80>
RewriteEngine on

RewriteCond %{QUERY_STRING} ^a=getcfg&preset=(.+)$
RewriteRule ^/webui/vislink.pl$ /xml/%1.xml

RewriteCond %{QUERY_STRING} ^a=(.+)&ip=(.+)&port=(.+)&tid=(.+)&r=(.+)$
RewriteRule ^/webui/webui_data.pl$ /xml/toggleLive.xml

RewriteCond %{QUERY_STRING} ^a=(.+)&r=(.+)$
RewriteRule ^/webui/webui_data.pl$ /xml/%1.xml?

RewriteCond %{QUERY_STRING} ^a=(.+)&iface=wlan(.+)&r=(.+)$
RewriteRule ^/webui/ipodwebui_data.pl$ /xml/%1.xml?

RewriteCond %{QUERY_STRING} ^a=(.+)&r=(.+)$
RewriteRule ^/webui/ipodwebui_data.pl$ /xml/%1.xml?

RewriteRule ^/IPS/GetIpList$ /xml/getIpList.xml
RewriteRule ^/IPS/GetIndex$ /xml/getCurrentId.txt
RewriteRule ^/IPS/GetImage$ /xml/getImgList.xml
RewriteRule ^/IPS/SetSourceType*$ /xml/SetSourceType.xml
RewriteRule ^/IPS/Select$ /xml/success.xml
RewriteRule ^/IPS/GoHome$ /xml/GoHome.xml
RewriteRule ^/IPS/Replace$ /xml/replace.txt

RewriteRule ^/TOKEN/createtoken$ /tokenInfo/createtoken.txt
RewriteRule ^/TOKEN/gettokeninfo$ /tokenInfo/gettokeninfo.txt
RewriteRule ^/TOKEN/getservertoken$ /tokenInfo/getservertoken.txt
RewriteRule ^/TOKEN/token*$ /tokenInfo/getPwd.txt

RewriteRule ^/cgi/recording/cgi_recording_check$ /xml/cgi_recording_check.xml
RewriteRule ^/cgi/recording/cgi_recording$ /xml/cgi_recording.xml
  
</VirtualHost>


<think>我们正在处理关于Apache配置URL重定向的问题。根据用户的问题,他/她想了解如何使用Apache配置URL重定向。我们将参考提供的引用信息,并结合Apache配置的一般知识来回答。 引用[1]中给出了一个.htaccess文件配置的例子,用于URL重定向。它展示了如何将根路径重定向到另一个端口(8080)的同一个主机。 引用[2]介绍了mod_rewrite模块的功能,包括重写URL以实现简洁的URL、隐藏真实地址、URL跳转、域名跳转、防盗链等。 引用[3]则展示了反向代理的设置,这与重定向不同,重定向是告诉客户端去访问另一个URL,而反向代理是服务器内部将请求转发到另一个服务器并返回结果给客户端。 用户的问题是关于URL重定向的,所以我们主要关注重定向(Redirect)和重写(Rewrite)两种方式。 在Apache中,配置URL重定向主要有两种方法: 1. 使用Redirect指令:简单重定向,适用于简单的重定向需求。 2. 使用mod_rewrite模块:功能更强大,可以实现复杂的重定向规则。 我们将分别介绍这两种方法。 注意:在修改配置前,请确保已备份配置文件,并且确保已启用相关模块(如mod_rewrite)。 步骤1:使用Redirect指令 Redirect指令用于简单的重定向,可以将一个URL重定向到另一个URL。语法如下: Redirect [状态码] 旧URL 新URL 例如,将旧路径重定向到新域名: Redirect permanent /oldpath http://www.newdomain.com/newpath 状态码可以是permanent(301)或temporary(302)等。 步骤2:使用mod_rewrite模块 mod_rewrite模块提供了更强大的功能。要使用它,首先确保模块已加载(在httpd.conf中应有LoadModule rewrite_module modules/mod_rewrite.so),并且允许在配置文件中使用重写规则(如AllowOverride All)。 在.htaccess文件中或者Apache的配置文件中(如httpd.conf或虚拟主机配置)可以这样写: RewriteEngine On RewriteRule 模式 替换 [标志] 例如,将根目录重定向到8080端口(如引用[1]所示): RewriteEngine On RewriteCond %{REQUEST_URI} ^/$ RewriteRule ^$ http://%{HTTP_HOST}:8080 [L,R] 这里,RewriteCond用于设置条件,%{REQUEST_URI}是请求的URI,'^/$'表示请求的是根路径(/)。然后RewriteRule将根路径重定向到http://当前主机:8080。[L]表示这是最后一条规则,[R]表示重定向(强制客户端发起新请求)。 另一个例子:将http重定向到https RewriteEngine On RewriteCond %{HTTPS} off RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L] 步骤3:其他重定向方式 除了上述两种,还可以使用Alias、ProxyPass(反向代理)等,但注意反向代理不是重定向,而是内部转发。 根据引用[3]中的反向代理设置: ProxyPass /proxy http://www.proxypass.com/proxy ProxyPassReverse /proxy http://www.proxypass.com/proxy 这会将所有以/proxy开头的请求转发到http://www.proxypass.com/proxy,但不会改变浏览器地址栏的URL。 因此,如果用户需要的是浏览器地址栏变化的跳转,应该使用Redirect或RewriteRule的R标志。 最后,我们给出一个完整的配置示例,并提醒用户根据实际情况修改。 注意:在.htaccess文件中使用重写规则时,需要确保该目录的配置允许覆盖(AllowOverride All)。 总结: - 简单重定向用Redirect - 复杂需求用mod_rewrite - 反向代理用ProxyPass(不改变URL,不是重定向) 现在,我们根据用户的问题,生成一个关于如何配置URL重定向的步骤说明。</think>### Apache配置URL重定向方法 在Apache中配置URL重定向主要通过两种方式实现:**基础重定向指令**和**mod_rewrite模块**。以下是具体操作方法: #### 一、基础重定向(使用`Redirect`指令) 适用于简单路径重定向,无需启用额外模块: ```apache # 将/old重定向到/new(302临时重定向) Redirect /old http://yourdomain.com/new # 永久重定向(301) Redirect permanent /old-page.html http://yourdomain.com/new-page.html ``` > 特点:配置简单,适合路径一对一映射[^2]。 #### 二、高级重写(使用`mod_rewrite`模块) 需要启用模块并设置规则,支持复杂条件匹配: 1. **启用模块**(在`httpd.conf`中): ```apache LoadModule rewrite_module modules/mod_rewrite.so <Directory "/var/www/html"> AllowOverride All # 允许.htaccess生效 </Directory> ``` 2. **常用场景示例**: ```apache RewriteEngine On # 场景1:强制HTTPS RewriteCond %{HTTPS} off RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L] # 场景2:域名重定向 RewriteCond %{HTTP_HOST} ^old.com$ [NC] RewriteRule ^(.*)$ http://new.com/$1 [R=301,L] # 场景3:路径重写(隐藏真实路径) RewriteRule ^products/([0-9]+)$ /product.php?id=$1 [L] # 场景4:带条件重定向(如特定IP) RewriteCond %{REMOTE_ADDR} ^192\.168\.1\.100$ RewriteRule ^admin/$ /maintenance.html [R=302,L] ``` > 关键标志说明: > `R=301`:永久重定向 > `L`:最后一条规则 > `NC`:忽略大小写[^2] #### 三、特殊场景处理 1. **保留查询参数**: ```apache RewriteRule ^old-path$ /new-path? [R=301,L] ``` `?`符号会保留原始URL参数[^2]。 2. **反向代理伪装**(非重定向): ```apache ProxyPass "/app" "http://backend-server:8080/" ProxyPassReverse "/app" "http://backend-server:8080/" ``` 用户浏览器地址不变,适合内部服务映射[^3]。 #### 验证与调试 1. 检查语法: ```bash apachectl configtest ``` 2. 开启日志调试: ```apache RewriteLogLevel 3 RewriteLog "/var/log/apache2/rewrite.log" ``` > **注意事项**: > - 永久重定向(301)会被浏览器缓存,测试时建议先用302 > - 修改.htaccess文件无需重启Apache,修改主配置需重启 > - 正则表达式测试工具推荐:https://regex101.com/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值