Apache ProxyPass配置问题:限制端口仅对应指定域名访问
Apache ProxyPass配置问题:限制端口仅对应指定域名访问
看起来你的问题核心在于两个React应用默认监听了服务器的所有网络接口(0.0.0.0),导致外部可以直接通过域名+端口的方式绕开Apache代理访问应用;再加上当前的Apache配置只做了反向转发,没有限制端口的直接访问权限,才出现了跨域名访问对应端口的情况。
下面给你两种解决思路,优先推荐第一种:
方法一:让应用仅监听localhost(最可靠)
这是从根源解决问题的方式,让你的React应用只在服务器本地的3939/3940端口运行,外部无法直接通过端口访问,必须走Apache的反向代理。
如果你用的是Create React App:
修改package.json里的启动命令,加上--host localhost参数:"scripts": { "start": "react-scripts start --host localhost" }如果你用的是Vite:
在vite.config.js里配置服务器仅监听localhost:export default defineConfig({ server: { host: 'localhost' } })
修改后重启应用,此时外部用户只能通过https://test.example.com访问3939端口的应用,https://test2.example.com访问3940端口的应用,直接用域名+端口的方式会无法连接。
方法二:通过Apache限制端口访问(备选方案)
如果因为某些原因无法修改应用的监听地址,可以通过Apache配置直接阻止外部访问3939/3940端口:
- 先在Apache的主配置文件里添加监听指令:
Listen 3939 Listen 3940
- 然后添加两个VirtualHost块,拒绝所有直接访问这两个端口的请求:
<VirtualHost *:3939> <Location /> Deny from all ErrorDocument 403 "该端口仅支持通过指定域名访问" </Location> </VirtualHost> <VirtualHost *:3940> <Location /> Deny from all ErrorDocument 403 "该端口仅支持通过指定域名访问" </Location> </VirtualHost>
同时确保你原有的两个HTTPS VirtualHost配置正确(注意替换掉[SSL]为实际的证书路径):
<IfModule mod_ssl.c> <VirtualHost *:443> ServerName test.example.com SSLCertificateFile /path/to/your/test-cert.pem SSLCertificateKeyFile /path/to/your/test-private.key ProxyPass / http://localhost:3939/ ProxyPassReverse / http://localhost:3939/ ProxyPreserveHost On </VirtualHost> <VirtualHost *:443> ServerName test2.example.com SSLCertificateFile /path/to/your/test2-cert.pem SSLCertificateKeyFile /path/to/your/test2-private.key ProxyPass / http://localhost:3940/ ProxyPassReverse / http://localhost:3940/ ProxyPreserveHost On </VirtualHost> </IfModule>
最后别忘了重启Apache服务,让配置生效。
备注:内容来源于stack exchange,提问作者dcr31000
相关产品推荐
相关产品推荐

