我在 CentOS 7 Linux 上的 HAProxy 1.5 后面运行一个嵌入在 Wordpress/Jetty 中的网络游戏。
该网站可以通过http
和访问https
。
我已经修改了 Wordpress,使其在以下 URL 上显示玩家资料页面:
https://slova.de/player-12345
12345
我的网络游戏中的数字玩家 ID 在哪里。
这很有效,但我想将上述 URL 简化为
https://slova.de/12345
然后使用HAProxy到将“player-”部分添加到纯数字路径的前面。
因此我在文件中添加了/etc/haproxy/haproxy.cfg
以下行:
http-request redirect code 301 prefix /player- if { path_end /5 }
但由于某种原因,这会导致 URL 损坏:
以下是我的完整haproxy.cfg
文件,以提供更多背景信息:
global
log 127.0.0.1 local2
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon
stats socket /var/lib/haproxy/stats
tune.ssl.default-dh-param 2048
defaults
mode http
log global
option httplog
option dontlognull
option http-server-close
option forwardfor except 127.0.0.0/8
option redispatch
retries 3
timeout http-request 10s
timeout queue 1m
timeout connect 10s
timeout client 1m
timeout server 1m
timeout http-keep-alive 10s
timeout check 10s
maxconn 3000
# for WebSocket connections
timeout tunnel 1h
timeout client-fin 1m
frontend public
bind 144.76.184.151:80
bind 144.76.184.151:443 ssl crt /etc/pki/tls/certs/slova.de.pem no-sslv3
http-request deny if { path_beg /xmlrpc.php }
http-request redirect code 301 prefix /player- if { path_end /5 }
default_backend jetty
backend jetty
server domain 127.0.0.1:8080 send-proxy
答案1
5
这意味着您正在向 URL 末尾带有数字的每个请求发送 301 重定向响应。
因此,如果您的第一个请求是http://www.example.com/5
,您的配置将发送 HTTP 301 重定向到 URL http://www.example.com/player-5
。然后浏览器请求此 URL,HAProxy 再次发送 HTTP 301 重定向,现在到http://www.example.com/player-/player-5
等等,直到达到某个 URL 长度限制。
我假设您不想在这里执行 301 重定向,而是将前缀附加player-
到发往 Jetty 的请求中。要实现这一点,您需要使用指令http-request set-path
。
但是,如果您想执行301 redirect
,则需要优化您的条件,以便仅player-
在 URL 中没有前缀时才进行重定向。
例如,这可能有效:
http-request redirect code 301 prefix /player- if { path_end /5 and !path_end /player-5 }
我自己没有使用过 HAProxy,所以这只是基于 HAProxy 文档和我对其 ACL 如何工作的解释。