Acl giving "404 Not Found"


#1

I am a newb to HAProxy, and am bashing my head against this one. I’m trying to set up what I think is a fairly simple exercise in redirecting a url to a specific port. I’d like for http://server.example.com/application to redirect to http://server.example.com:8091. To that end, I have the following config:

global
    daemon
    maxconn 256

defaults
    mode http
    timeout connect 50000ms
    timeout client 50000ms
    timeout server 50000ms

frontend http-in
    bind *:80
    acl application url_end application
    use_backend application_admin if application
    default_backend web

backend application_admin
    server server1 127.0.0.1:8091

backend web
    server server1 127.0.0.1:8080

The redirect to 8080 as the default works fine, apache is listening on 8080. But when I go to server.example.com/application, I get a 404 error:

curl -v server.example.com/application
*   Trying server.example.com...
* TCP_NODELAY set
* Connected to server.example.com (server.example.com) port 80 (#0)
> GET /application HTTP/1.1
> Host: server.example.com
> User-Agent: curl/7.51.0
> Accept: */*
>
< HTTP/1.1 404 Object Not Found
< Server: MochiWeb/1.0 (Any of you quaids got a smint?)
< Date: Wed, 08 Feb 2017 23:00:51 GMT
< Content-Type: text/plain
< Content-Length: 10
< Cache-Control: max-age=10
<
* Curl_http_done: called premature == 0
* Connection #0 to host server.example.com left intact
Not found.

The port does work, because I can browse directly to server.example.com:8091.

Any help greatly appreciated!


#2

Well, I’ve made some progress. I added the following:

reqrep ^([^\ ]*\ )/couchbase(.*) \1\ /\2

To my backend application_admin above. It is now sort of attempting to do the right thing, but it’s dropping the port in the final url:

curl -v server.example.com/application
* About to connect() to server.example.com port 80 (#0)
*   Trying server.example.com...
* Connected to server.example.com (server.example.com) port 80 (#0)
> GET /application HTTP/1.1
> User-Agent: curl/7.29.0
> Host: server.example.com
> Accept: */*
>
< HTTP/1.1 301 Moved Permanently
< Server: Application Server
< Pragma: no-cache
< Location: http://server.example.com/ui/index.html
< Date: Thu, 09 Feb 2017 17:22:11 GMT
< Content-Type: text/html
< Content-Length: 234
< Cache-Control: no-cache
<
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"><html><head><title>301 Moved Permanently</title></head><body><h1>Moved Permanently</h1><p>The document has moved <a href="http://server.example.com/ui/index.html>here</a>.</p></body></html>
* Connection #0 to host server.example.com left intact

The final url should actually be http://server.example.com:8091/ui/index.html like so:

curl -v server.example.com:8091
* About to connect() to server.example.com port 8091 (#0)
*   Trying server.example.com...
* Connected to server.example.com (server.example.com) port 8091 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.29.0
> Host: server.example.com:8091
> Accept: */*
>
< HTTP/1.1 301 Moved Permanently
< Server: Application Server
< Pragma: no-cache
< Location: http://server.example.com:8091/ui/index.html
< Date: Thu, 09 Feb 2017 17:27:04 GMT
< Content-Type: text/html
< Content-Length: 239
< Cache-Control: no-cache
<
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"><html><head><title>301 Moved Permanently</title></head><body><h1>Moved Permanently</h1><p>The document has moved <a href="http://server.example.com:8091/ui/index.html>here</a>.</p></body></html>
* Connection #0 to host server.example.com left intact

Clearly I’m not understanding the regex well enough, but I’m not sure where I’m going wrong.


#3

I ended up going a different direction with this. Instead of using server I used http-request redirect instead. Works a treat!