CouchDB
  1. CouchDB
  2. COUCHDB-321

Futon breaks when used with a reverse proxy

    Details

    • Type: Bug Bug
    • Status: Closed
    • Priority: Minor Minor
    • Resolution: Fixed
    • Affects Version/s: 0.9
    • Fix Version/s: 0.11
    • Component/s: Futon
    • Labels:
      None
    • Environment:

      Affects all platforms.

      Description

      It is often convenient to reverse proxy CouchDB at a url like /couch. Unfortunately, while CouchDB will work perfectly in this situation, Futon cannot handle it as jquery.couch.js uses absolute URLs to access all CouchDB functions.

      I've attached a small patch that fixes this problem by:

      1. Adding a urlPrefix attribute to $.couch which it uses to construct its URLs.
      2. Adding logic to the futon.js constructor that figures out a suitable prefix and sets $.couch.urlPrefix to use this.

      Any client code that makes use of $.couch will need to do something similar. Since only the application and the adminstrator will know what the prefix should be or how to deduce it, I didn't really know of a better way to handle this.

      1. futon.patch
        3 kB
        Jack Moffitt
      2. futon-proxy-fix.diff
        5 kB
        Damjan Georgievski

        Issue Links

          Activity

          Hide
          Jan Lehnardt added a comment -

          Applied in r904705.

          Show
          Jan Lehnardt added a comment - Applied in r904705.
          Hide
          Damjan Georgievski added a comment -

          attaching the fix.

          ps. the nginx conf used for testing is:
          server {
          location /

          { proxy_pass http://127.0.0.1:5984; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_redirect off; }

          location /db/

          { rewrite /db/(.*) /$1 break; proxy_pass http://127.0.0.1:5984; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_redirect off; }
          Show
          Damjan Georgievski added a comment - attaching the fix. ps. the nginx conf used for testing is: server { location / { proxy_pass http://127.0.0.1:5984; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_redirect off; } location /db/ { rewrite /db/(.*) /$1 break; proxy_pass http://127.0.0.1:5984; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_redirect off; }
          Hide
          Damjan Georgievski added a comment -

          In my opinion it would be better if Futon only uses relative urls.
          That way it'll not require any hacks nor admin configuration.

          Here's a patch against 0.11.0b3fa3b673-git that implements this.

          With this patch all except one tests pass when running directly on CouchDB.

          Using Nginx as a proxy some of the tests fail regardless of if it's proxying on the root or on a usb-url, because Nginx rewrites url's (so any tests with test_suite_db%2Fwith_slashes fail). Also tests expecting the Server http header to be CouchDB fail too. The config.httpd.port == port check obviously fails too.

          The oauth test is the only one that fails without the proxy, and it's because it creates externall urls (http://) to which this patch prepends ".." There are several ways to solve this, but I think .request should have an _external flag or something.

          Show
          Damjan Georgievski added a comment - In my opinion it would be better if Futon only uses relative urls. That way it'll not require any hacks nor admin configuration. Here's a patch against 0.11.0b3fa3b673-git that implements this. With this patch all except one tests pass when running directly on CouchDB. Using Nginx as a proxy some of the tests fail regardless of if it's proxying on the root or on a usb-url, because Nginx rewrites url's (so any tests with test_suite_db%2Fwith_slashes fail). Also tests expecting the Server http header to be CouchDB fail too. The config.httpd.port == port check obviously fails too. The oauth test is the only one that fails without the proxy, and it's because it creates externall urls ( http:// ) to which this patch prepends ".." There are several ways to solve this, but I think .request should have an _external flag or something.
          Hide
          Jack Moffitt added a comment -

          Mike, that looks great. Perhaps you could attach a modified patch that moved the logic to $.ajaxsetup?

          Show
          Jack Moffitt added a comment - Mike, that looks great. Perhaps you could attach a modified patch that moved the logic to $.ajaxsetup?
          Hide
          Mike Frawley added a comment -

          Thanks Jack, I was having this same problem which was rather annoying.

          I used this simpler logic to get the urlPrefix:

          urlPrefix: window.location.pathname.split("/_utils/")[0]

          I'm wondering if prepending the urlPrefix should be done in $.ajaxsetup() instead of every ajax call, which could make it a bit easier to manage.

          Show
          Mike Frawley added a comment - Thanks Jack, I was having this same problem which was rather annoying. I used this simpler logic to get the urlPrefix: urlPrefix: window.location.pathname.split("/_utils/") [0] I'm wondering if prepending the urlPrefix should be done in $.ajaxsetup() instead of every ajax call, which could make it a bit easier to manage.
          Hide
          Jack Moffitt added a comment -

          Patch attached for jquery.couch.js and futon.js.

          Show
          Jack Moffitt added a comment - Patch attached for jquery.couch.js and futon.js.

            People

            • Assignee:
              Unassigned
              Reporter:
              Jack Moffitt
            • Votes:
              0 Vote for this issue
              Watchers:
              1 Start watching this issue

              Dates

              • Created:
                Updated:
                Resolved:

                Development