Spurious "/.com" inserted into URL

Igor Sysoev igor at sysoev.ru
Tue Aug 10 00:23:04 MSD 2010


On Mon, Aug 09, 2010 at 02:03:27PM -0400, desiato wrote:

> (You can see this pretty-printed at
> http://serverfault.com/questions/168098/nginx-just-started-inserting-spurious-coms-into-our-urls
> )
> 
> I made some minor changes to our nginx config on Friday (deploying SSL
> certs: adding a server listening on 443 with the appropriate settings
> and adding a couple rewrite rules to forward certain requests to it) and
> all of a sudden our URLs started getting extra "/.com"s inserted into
> them.  For example, clicking a link to http://domain.com/logout/ takes
> the user to http://domain.com/logout/.com/.  http://domain.com/register/
> forwards to http://domain.com/.com/register/.  This doesn't happen with
> a subdomain (e.g. http://production.domain.com/logout/ just works) and
> it also doesn't happen with https://domain.com/ (so right now, as a
> workaround, the entire site is being served with https).
> 
> Our nginx serves static content and proxies dynamic requests to Apache,
> which is pretty standard for Django.  This had been working fine for
> months; I have no idea why it stopped working.  I can't even be sure the
> problem is at the nginx level, but that's the only thing I changed, so
> that's where my attention has been.
> 
> Any help/suggestions would be greatly appreciated.

Try to log $sent_http_location and $upstream_http_location to
see who sent wrong redirects.

> Here are the relevant config files (again, the link above has this
> formatted nicely):
> 
> 
> [quote=nginx.conf]
> #######################################################################
> #
> # This is the main Nginx configuration file.  
> #
> # More information about the configuration options is available on 
> #   * the English wiki - http://wiki.codemongers.com/Main
> #   * the Russian documentation - http://sysoev.ru/nginx/
> #
> #######################################################################
> 
> #----------------------------------------------------------------------
> # Main Module - directives that cover basic functionality
> #
> #   http://wiki.codemongers.com/NginxMainModule
> #
> #----------------------------------------------------------------------
> 
> user              nginx;
> worker_processes  4;
> 
> error_log         /var/log/nginx/error.log;
> #error_log        /var/log/nginx/error.log  notice;
> #error_log        /var/log/nginx/error.log  info;
> 
> pid               /var/run/nginx.pid;
> 
> 
> 
> #----------------------------------------------------------------------
> # Events Module 
> #
> #   http://wiki.codemongers.com/NginxEventsModule
> #
> #----------------------------------------------------------------------
> 
> events {
>     worker_connections  1024;
> }
> 
> 
> #----------------------------------------------------------------------
> # HTTP Core Module
> #
> #   http://wiki.codemongers.com/NginxHttpCoreModule 
> #
> #----------------------------------------------------------------------
> 
> http {
>     include       /etc/nginx/mime.types;
>     default_type  application/octet-stream;
> 
>     log_format  main  '$remote_addr - $remote_user [$time_local]
> $request '
>                       '"$status" $body_bytes_sent "$http_referer" '
>                       '"$http_user_agent" "$http_x_forwarded_for"';
> 
>     access_log  /var/log/nginx/access.log  main;
> 
>     sendfile        on;
> 
>     keepalive_timeout  65;
> 
>     # Load config files from the /etc/nginx/conf.d directory
>     include /etc/nginx/conf.d/*.conf;
> 
>     # the upstream apache server
>     upstream django {
>         server  localhost:9000;
>     }
> 
>     upstream blog {
>         server  localhost:9001;
>     }
> 
>     server {
>         listen      80;
>         server_name www.domain.com beta.domain.com;
>         rewrite ^/(.*) http://domain.com/$1 permanent;
>     }
> 
> 
>     server {
>         listen      80;
>         server_name domain.com production.domain.com;
>         root    /var/www/domain.com/;
>         access_log  /var/log/nginx/domain.com.access.log;
> 
>         location ~ ^/blog/ {
>             proxy_set_header     Host             $host;
>             proxy_pass           http://blog;
>         }
> 
>         location / {
> 
>             proxy_set_header X-Forwarded-For
> $proxy_add_x_forwarded_for;
>             proxy_set_header Host $host;
>             proxy_set_header X-Real-IP $remote_addr;
> 
>             if (-f $request_filename/index.html) {
>                 rewrite (.*)    $1/index.html break;
>             }
> 
>             if ($request_filename ~ "/register/") {
>                 rewrite ^/(.*)  https://domain.com/$1 permanent;
>             }
> 
>             if ($request_filename ~ "/accounts/subscription/") {
>                 rewrite ^/(.*)  https://domain.com/$1 permanent;
>             }
> 
>             # temporary workaround for weird .com bug
>             rewrite ^/(.*)  https://domain.com/$1 permanent;
> 
>             if (!-f $request_filename) {
>                 proxy_pass         http://django;
>             }
>         }

This configuration should rewritten as

         location / {
             try_files  $uri/index.html  $uri  @django;
         }
 
         location @django {
             proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
             proxy_set_header Host $host;
             proxy_set_header X-Real-IP $remote_addr;
             proxy_pass         http://django;
         }

         location /register/ {
             rewrite ^/(.*)  https://domain.com/$1 permanent;
         }

         location /accounts/subscription/ {
             rewrite ^/(.*)  https://domain.com/$1 permanent;
         }

>     }
> 
>     server {
>         listen 443;
>         server_name domain.com production.domain.com;
>         root /var/www/domain.com/;
>         access_log /var/log/nginx/domain.com.https.access.log;
>         error_log /var/log/nginx/domain.com.https.error.log;
> 
>         ssl on;
>         ssl_certificate /etc/nginx/conf.d/full.crt;
>         ssl_certificate_key /etc/nginx/conf.d/pass_server.key;
>         ssl_prefer_server_ciphers on;
> 
>         location / {
> 
>             if (-f $request_filename/index.html) {
>                 rewrite (.*) $1/index.html break;
>             }
>             if (!-f $request_filename) {
>                 proxy_pass http://django;
>             }

         location / {
             try_files  $uri/index.html  $uri  @django;
         }
 
         location @django {
             proxy_pass         http://django;
         }

> [/quote]
> 
> 
> [quote=conf.d/virtual.conf]
> server {
>     listen      80;
>     server_name 11.22.33.44;
>     root    /var/www/domain.com/;
>     access_log  /var/log/nginx/domain.com.directip.access.log;
> 
>     location / {
>         if (-f $request_filename/index.html) {
>             rewrite (.*)    $1/index.html break;
>         }
>         if (!-f $request_filename) {
>             proxy_pass         http://django;
>         }
>     }
> 
> }
> [/quote]


-- 
Igor Sysoev
http://sysoev.ru/en/



More information about the nginx mailing list