你遇到的情况非常典型:其他系统(如静态网页、Java/Python应用)隐藏端口只需 Nginx 反向代理即可,但 WordPress 会“强制”显示端口,是因为 WordPress 自身逻辑在生成链接时,强行从数据库中读取了带端口的旧地址,或者错误判断了当前协议和主机名。
7 I( z4 {2 X6 V" ^2 h4 `
6 H3 Y: M& P' g# C简单来说,Nginx 把请求转发进去了,但 WordPress 返回给浏览器的 HTML 代码里,所有的 <a href>、<img src> 甚至重定向(301/302)地址里都写着 http://域名:端口。浏览器拿到这个地址后,自然就会显示出端口。( h" L+ ^' ^5 h$ Z( m$ {
! |9 g8 |* S* ^. e `要彻底解决 WordPress 的“强制显示端口”问题,必须在 WordPress 内部层面进行修正,而不仅仅是在服务器层面做代理。请按照以下三个步骤操作,缺一不可:9 j4 s; y; w5 n$ U! g
( x$ @0 `/ b: @7 N, V6 T! T
第一步:修改 wp-config.php(最核心步骤)
8 E! H: U) [7 t F; M这是解决 WordPress “顽固”显示端口的最有效方法。通过定义常量,强制 WordPress 忽略数据库中的旧设置,动态使用当前访问的域名和协议。3 j9 G4 v3 J8 s( d/ T
& s5 [. D6 v, P9 b5 t0 Z请在你的 WordPress 根目录下的 wp-config.php 文件中,找到 /* That's all, stop editing! Happy publishing. */ 这一行,在它之前添加以下代码:* Z" x7 g% Q& t, \7 F. Z' Z* D
! [* J+ B0 j6 p+ _6 n8 x
php
' O! k8 u( b$ E* {/** 强制修正站点地址,解决内网穿透端口显示问题 */
9 W/ P9 \( B) q Bif (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') {
2 V! w$ X9 z" b0 \% y4 X $_SERVER['HTTPS'] = 'on';
+ C! H, v( o; [2 N; L' X}3 Y. m4 b# R4 w- G# Z+ d
8 m' o5 c5 x9 @
// 动态获取当前访问的主机名(域名),自动隐藏端口
7 Q9 d+ Y6 ?6 N7 Adefine('WP_HOME', 'http://' . $_SERVER['HTTP_HOST']);& m; Z5 z) C. I/ ]5 \3 q6 b9 t
define('WP_SITEURL', 'http://' . $_SERVER['HTTP_HOST']);
0 G3 S4 v; b7 u2 L7 z% L$ Y7 F5 |- I* y- f! F, p/ H
// 如果你配置了 HTTPS,请将上面的 http 改为 https
+ r6 x3 D6 z8 `$ a: e# b// define('WP_HOME', 'https://' . $_SERVER['HTTP_HOST']);
& W( ?4 X, F$ m* o1 Q// define('WP_SITEURL', 'https://' . $_SERVER['HTTP_HOST']);& R0 N9 E% u, n, w0 g+ A7 y
原理解释:
- q, X- v( H; Q) P
' ^# p, c" ]7 C$_SERVER['HTTP_HOST'] 会获取用户浏览器实际访问的域名(例如 example.com),而不包含端口(因为浏览器访问标准80/443端口时不显示端口)。
. Q% e$ o M1 a, k; p: {8 b通过 define 强制覆盖数据库中的 siteurl 和 home 值,WordPress 生成所有链接时都会使用这个动态获取的无端口域名。5 H; g8 \! o" p# P
第二步:清理数据库中残留的端口信息
4 p; R" C j G. r6 U/ H0 S$ R即使做了第一步,数据库中可能还残留着旧的带端口的 URL,导致某些插件或硬编码的链接依然显示端口。
; h8 {5 ?" V% w5 E$ z' Q9 L
! A! v5 x# L, @, G登录 phpMyAdmin 或使用命令行进入 MySQL。
1 s9 Y# v$ W5 D, s ^- Q执行以下 SQL 语句,将数据库中所有带端口的旧地址替换为新的无端口地址(请根据实际情况修改域名):
# K) h$ [7 e$ J8 \# ~. G! vsql" L" U) i& n4 ^0 C" M$ b% A- W* {
-- 假设你的域名是 example.com,旧地址是 example.com:8080
3 S, N+ ^3 @6 u! L. w1 `UPDATE wp_options SET option_value = replace(option_value, 'http://example.com:8080', 'http://example.com') WHERE option_name = 'home' OR option_name = 'siteurl';
/ k: }/ t$ O5 h# F* v5 {9 e
7 F7 M7 Z& X$ ?* q+ e- \6 k-- 替换文章内容和元数据中的链接( i! ~8 X% t, H* o' k! c+ q* y. O
UPDATE wp_posts SET post_content = replace(post_content, 'http://example.com:8080', 'http://example.com');
: ^ \2 ^+ }5 X* o" wUPDATE wp_postmeta SET meta_value = replace(meta_value, 'http://example.com:8080', 'http://example.com');
$ z) C* w' b8 k8 ~: e. E+ w5 U注意:如果你的表前缀不是 wp_,请修改为实际的前缀。+ `4 l% r9 g) n( v8 j
' \3 A* Y4 |& H) z' h
第三步:检查 Nginx 反向代理配置(确保头信息正确传递)
. p, W5 M1 I0 e8 T+ F; ~8 o( R. W为了确保 WordPress 能正确识别协议(HTTP/HTTPS),Nginx 的配置必须包含 X-Forwarded-Proto 头。, z7 R! q3 r; D) t8 f
2 ]- s3 A' Y8 ]% p0 z0 e
你的 Nginx 配置应该类似这样:2 B H: r. n' d4 A
" h# i, d, a% ^/ Y4 g. v
nginx
! D% j. Q, B) `& D& V- F% yserver {2 H7 G( z0 B+ a+ y! F% {
listen 80;
& L! O7 j# O; S% V( j. R server_name your-domain.com; # 你的域名, [( x, x+ B0 g W# S
! B" Y$ \3 ?6 R* ~, ~ M
location / {
3 j. f& o% G) u/ {+ S # 指向 frp 监听的 vhostHTTPPort 或本地 WordPress 端口9 N1 P/ Q2 `3 j
proxy_pass http://127.0.0.1:7788; & H) N2 ~9 A. d: v; Z/ V0 p$ K% A
- v. L( F/ a7 r q # 关键头信息,必须包含* H, x! v% M# X8 k9 A1 L1 R. k
proxy_set_header Host $host;
- F& k( V6 v) W' a! ] proxy_set_header X-Real-IP $remote_addr;
* Y) M$ [4 \( c proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;) }" b8 b1 W5 y( w9 L$ S
proxy_set_header X-Forwarded-Proto $scheme; # 告诉 WordPress 原始请求是 http 还是 https
" S8 {$ R' h( S }
, S! ~, o6 ~% }6 y* G}/ Z3 d# N4 L' `2 Q }4 _: a' }. E
常见坑点排查' r: {( l* r$ F0 O8 I9 h0 n2 y
缓存问题:修改完 wp-config.php 后,务必清除浏览器缓存、WordPress 缓存插件(如 WP Super Cache、W3 Total Cache)以及 CDN 缓存。否则你可能看到的还是旧的带端口的页面。
9 A5 Q8 i) n* w+ e, s' R6 n, ?HTTPS 混合内容:如果你使用了 HTTPS,但 WordPress 内部仍生成 HTTP 链接,浏览器会报错或显示不安全。确保 wp-config.php 中的 WP_HOME 和 WP_SITEURL 使用 https://,并且 Nginx 配置了 SSL 证书。
: ^. Q& g$ W2 g- @1 U2 s& fFrps 配置:确保 frps.ini 中的 vhostHTTPPort 和 vhostHTTPSPort 已设置,并且 Nginx 反向代理指向的是这些端口,而不是直接指向 WordPress 的本地端口(除非你直接在 frpc 中绑定了域名并使用了 vhost 模式)。: d# C6 K H6 D; ]8 j
总结:
3 x! i! Q; O* V1 H- _其他系统不显示端口是因为它们不存储“自我认知”的 URL,而 WordPress 存储了。通过 wp-config.php 中的 define('WP_HOME', 'http://' . $_SERVER['HTTP_HOST']); 这一行代码,你可以强制 WordPress “忘记”数据库中的带端口地址,从而彻底隐藏端口。3 o4 Z; q3 S& `3 W
; U6 N" ~. b2 s: W
参考 |