apache中判断端口最可靠方式是使用%{server_port}变量,如!^443$用于强制https跳转;%{http_host}可匹配显式端口(如:8080$),但需注意其格式依赖用户输入,而%{server_name}不反映实际请求端口。

Apache 的 RewriteCond 本身不直接提供“端口”变量,但可以通过 %{HTTP_HOST} 或 %{SERVER_PORT} 间接匹配端口。
用 %{SERVER_PORT} 直接判断端口
这是最常用、最可靠的方式:%{SERVER_PORT} 返回当前请求实际使用的服务器端口号(字符串形式),比如 "80"、"443" 或 "8080"。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 匹配非标准 HTTP 端口(如 8080):
RewriteCond %{SERVER_PORT} ^8080$ - 匹配 HTTPS 默认端口:
RewriteCond %{SERVER_PORT} ^443$ - 匹配非 443 端口(常用于强制 HTTPS 跳转前判断):
RewriteCond %{SERVER_PORT} !^443$
从 %{HTTP_HOST} 提取并匹配带端口的主机名
%{HTTP_HOST} 包含用户访问时输入的完整主机标识,格式为 host:port(当显式指定了非默认端口时)。例如:
访问 http://example.com:8080/ → %{HTTP_HOST} 值为 example.com:8080
访问 https://example.com/ → 通常为 example.com(不带 :443)
- 匹配包含特定端口的请求:
RewriteCond %{HTTP_HOST} :8080$(注意冒号需字面匹配) - 更严谨写法(防止误匹配子域名):
RewriteCond %{HTTP_HOST} :\d+$(匹配任意显式端口号) - 只匹配带端口的请求(排除无端口情况):
RewriteCond %{HTTP_HOST} :
常见组合场景示例
比如强制跳转到 HTTPS 且去除显式端口:
- 当不是 443 端口时重定向到 443(HTTPS):
RewriteCond %{SERVER_PORT} !^443$RewriteRule ^(.*)$ https://%{HTTP_HOST}:443%{REQUEST_URI} [R=301,L] - 当
HTTP_HOST显式含 :8080 时,跳转到标准 80 端口(不带端口):RewriteCond %{HTTP_HOST} :8080$RewriteRule ^(.*)$ http://%{HTTP_HOST}:%{SERVER_NAME}%{REQUEST_URI} [R=301,L](注意此处需替换为不含端口的域名,推荐用%{SERVER_NAME}或硬编码)
注意事项
不要用 %{SERVER_NAME} 判断端口——它只返回配置中定义的 ServerName,不反映实际请求端口。%{SERVER_PORT} 是服务器接收请求时绑定的端口,不受反向代理干扰;若前端有 Nginx 或 CDN,可能需要配合 X-Forwarded-Port 头(需额外启用 %{HTTP_X_FORWARDED_PORT} 并确保可信来源)。










