为何.htaccess的Rewrite规则实现URL掩码映射不生效
规则失效原因
- 匹配逻辑错误:
RewriteRule仅匹配域名、端口之后的请求URI路径,不会匹配端口段内容。你写的匹配规则^:9000/something\/?$试图匹配路径开头的:9000字段,但实际传入重写引擎的路径里不存在这部分内容,完全无法命中。 - 规则顺序错误:你自定义的规则放在了原有
RewriteRule . /index.php [L]之后,这条规则带[L](终止重写)标志,所有非真实存在的文件/目录请求都会被这条规则拦截转发,后续规则根本没有执行机会。 - 转发方向写反:你的需求是访问
/mysite时返回9000端口/something的内容,但你写的规则是匹配/something路径跳转到/mysite,逻辑完全颠倒。
实现方案
要实现地址栏保持/mysite的URL掩码效果,本质是做反向代理,需要先确认Apache已启用mod_proxy、mod_proxy_http两个模块,再把自定义规则放到所有原有不可修改规则的最前面,完整配置如下:
<IfModule mod_rewrite.c> Options -MultiViews RewriteEngine On RewriteBase / # 新增规则:匹配/mysite请求,内部代理到9000端口服务 RewriteRule ^mysite/?$ http://127.0.0.1:9000/something [P,L] # 如果需要支持/mysite下的所有子路径转发,把上面一行替换为下面的规则 # RewriteRule ^mysite/(.*)$ http://127.0.0.1:9000/something/$1 [P,L] # 以下原有规则完全保持不变,不要修改 RewriteCond %{REQUEST_FILENAME} !-f RewriteRule \.(jpeg|jpg|gif|png)$ /public/404.php [NC,L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] </IfModule>
配置说明:
[P]标志表示触发代理转发,请求在服务器内部完成对9000端口服务的访问,直接返回内容给客户端,浏览器地址栏会始终显示/mysite路径,不会暴露后端9000端口的地址,完全符合掩码要求。- 代理目标地址用
127.0.0.1即可,不需要写公网域名,能减少不必要的网络绕行开销。如果9000端口的服务部署在其他服务器,替换成对应服务的内网/公网IP即可。 - 规则放在所有原有规则之前,搭配
[L]标志,命中/mysite请求后直接终止后续重写流程,不会被原有规则覆盖。
内容的提问来源于stack exchange,提问作者gobler
相关产品推荐
相关产品推荐

