CentOS7下Apache反向代理与RewriteRule优先级问题求助
解决Apache反向代理与RewriteRule优先级冲突问题
问题原因
Apache默认会先执行RewriteRule规则,再处理ProxyPass配置。你的兜底规则RewriteRule ^/* /index.php [L]会匹配所有未被前面规则覆盖的请求,包括/mediaproxy路径,导致请求被直接导向index.php,反向代理规则无法生效。
解决方案
有两种简单的调整方式,任选其一即可:
方式一:添加RewriteRule跳过/mediaproxy路径
在RewriteEngine on之后、其他Rewrite规则之前,添加一条规则,让/mediaproxy开头的请求直接跳过后续Rewrite处理,留给ProxyPass生效:
RewriteEngine on # 新增规则:匹配/mediaproxy开头的请求,不修改URL并停止后续Rewrite处理 RewriteRule ^/mediaproxy - [L] RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^/api/media/(.*) /data/$1 [L] RewriteRule ^/api/v1/* /api/v1/index.php [L] RewriteRule ^/assets/(.*) /site/v1/content/assets/$1 [L] RewriteRule ^/css/(.*) /site/v1/content/css/$1 [L] RewriteRule ^/js/(.*) /site/v1/content/js/$1 [L] RewriteRule ^/fonts/(.*) /site/v1/content/fonts/$1 [L] RewriteRule ^/* /index.php [L] # 兜底规则
方式二:修改兜底规则的条件,排除/mediaproxy路径
在兜底的RewriteRule前面添加一条RewriteCond,排除/mediaproxy开头的请求:
RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^/api/media/(.*) /data/$1 [L] RewriteRule ^/api/v1/* /api/v1/index.php [L] RewriteRule ^/assets/(.*) /site/v1/content/assets/$1 [L] RewriteRule ^/css/(.*) /site/v1/content/css/$1 [L] RewriteRule ^/js/(.*) /site/v1/content/js/$1 [L] RewriteRule ^/fonts/(.*) /site/v1/content/fonts/$1 [L] # 新增条件:排除/mediaproxy开头的请求 RewriteCond %{REQUEST_URI} !^/mediaproxy RewriteRule ^/* /index.php [L] # 兜底规则
额外注意事项
- 确保CentOS7上已启用Apache的代理模块,执行以下命令启用并重启服务:
sudo a2enmod proxy proxy_http sudo systemctl restart httpd
- 修改配置后,记得检查配置语法并重启Apache:
sudo apachectl configtest sudo systemctl restart httpd
内容的提问来源于stack exchange,提问作者sanjihan
相关产品推荐
相关产品推荐

