Quantcast

rewrite don't work in a multilanguage MVC site

classic Classic list List threaded Threaded
6 messages Options
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

rewrite don't work in a multilanguage MVC site

Fernando García Torres
Hi!
Im trying to move from Apache to nginx (v1.1.6), but you know, rewrite newbie here... In my site when a user types http://site.com he's redirected to http://site.com/en/, and all the other URLs are internally handled by an index.php. This is my actual Apache htaccess:

    RewriteEngine On

    RewriteCond %{HTTP:Accept-Language} ^en [NC]
    RewriteRule ^$ /en/ [L,R=301]

    RewriteCond %{HTTP:Accept-Language} ^es [NC]
    RewriteRule ^$ /es/ [L,R=301]

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule (.*) index.php?ctr=$1 [QSA,L]

And this my translation to nginx:

    location / {
            if (-f $request_filename) {  
                    expires 30d;  
                    break;  
            }

            if ($http_accept_language ~* "^es") {
                    rewrite ^/$ /es/ permanent;
                    break;
            }

            if ($http_accept_language ~* "^en") {
                    rewrite ^/$ /en/ permanent;
                    break;
            }

            if (!-e $request_filename) {  
                    rewrite (.*) /index.php?ctr=$1 last;  
            }  
    }
    location ~ \.php$ {
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            ...

With this, when I type http://site.com I'm being redirected to http://site.com/en/, great, but I get a 404 error, and in the error.log I have this line:

    "/bla/bla/html/en/index.php" is not found 

So, why is not nginx looking for the URI /index.php?ctr=/en/?

_______________________________________________
nginx mailing list
[hidden email]
http://mailman.nginx.org/mailman/listinfo/nginx
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: rewrite don't work in a multilanguage MVC site

António P. P. Almeida
On 25 Out 2011 17h56 WEST, [hidden email] wrote:

> [1  <multipart/alternative (7bit)>]
> [1.1  <text/plain; iso-8859-1 (quoted-printable)>]
>
> Hi!Im trying to move from Apache to nginx (v1.1.6), but you know,
> rewrite newbie here... In my site when a user types http://site.com
> he's redirected to http://site.com/en/, and all the other URLs are
> internally handled by an index.php. This is my actual Apache

Try this:

At the http level.

map $http_accept_language $is_english {
   default 0;
   ~^en  1;
}

map $http_accept_language $is_spanish {
   default 0;
   ~^es  1;
}

location / {

  expires 30d;

  if ($is_english) {
     return 301 /en;  
  }

  if ($is_spanish) {
     return 301 /es;
  }

  location /es {}
     
  location /en {}

  try_files $uri $uri/ /index.php?ctr=$uri;
}

location ~\.php$ {
  # PHP stuff
}

--- appa

_______________________________________________
nginx mailing list
[hidden email]
http://mailman.nginx.org/mailman/listinfo/nginx
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

RE: rewrite don't work in a multilanguage MVC site

Fernando García Torres
Tried, and same results, redirect OK but 404 response. 

Thanks!!


> Date: Tue, 25 Oct 2011 18:15:38 +0100

> From: [hidden email]
> To: [hidden email]
> Subject: Re: rewrite don't work in a multilanguage MVC site
>
> On 25 Out 2011 17h56 WEST, [hidden email] wrote:
>
> > [1 <multipart/alternative (7bit)>]
> > [1.1 <text/plain; iso-8859-1 (quoted-printable)>]
> >
> > Hi!Im trying to move from Apache to nginx (v1.1.6), but you know,
> > rewrite newbie here... In my site when a user types http://site.com
> > he's redirected to http://site.com/en/, and all the other URLs are
> > internally handled by an index.php. This is my actual Apache
>
> Try this:
>
> At the http level.
>
> map $http_accept_language $is_english {
> default 0;
> ~^en 1;
> }
>
> map $http_accept_language $is_spanish {
> default 0;
> ~^es 1;
> }
>
> location / {
>
> expires 30d;
>
> if ($is_english) {
> return 301 /en;
> }
>
> if ($is_spanish) {
> return 301 /es;
> }
>
> location /es {}
>
> location /en {}
>
> try_files $uri $uri/ /index.php?ctr=$uri;
> }
>
> location ~\.php$ {
> # PHP stuff
> }
>
> --- appa
>
> _______________________________________________
> nginx mailing list
> [hidden email]
> http://mailman.nginx.org/mailman/listinfo/nginx

_______________________________________________
nginx mailing list
[hidden email]
http://mailman.nginx.org/mailman/listinfo/nginx
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: rewrite don't work in a multilanguage MVC site

António P. P. Almeida
On 25 Out 2011 19h17 WEST, [hidden email] wrote:

>
> Tried, and same results, redirect OK but 404 response.
> Thanks!!

Show your complete config.

--- appa

_______________________________________________
nginx mailing list
[hidden email]
http://mailman.nginx.org/mailman/listinfo/nginx
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

RE: rewrite don't work in a multilanguage MVC site

Fernando García Torres
> Date: Tue, 25 Oct 2011 19:33:15 +0100
> From: [hidden email]

> To: [hidden email]
> Subject: Re: rewrite don't work in a multilanguage MVC site
>
> On 25 Out 2011 19h17 WEST, [hidden email] wrote:
>
> >
> > Tried, and same results, redirect OK but 404 response.
> > Thanks!!
>
> Show your complete config.
>
> --- appa
>

Here we go. Those includes are the standard locations por PHP-FPM and static content:

map $http_accept_language $is_english {
default 0;
~^en 1;
}

map $http_accept_language $is_spanish {
default 0;
~^es 1;
}

server 
{
listen   80;
server_name localhost;
root   blah/blah;

location / {
auth_basic  "Restricted";
auth_basic_user_file  htpasswd;
index index.php index.html;  

expires 30d;

if ($is_english) {
return 301 /en; 
}

if ($is_spanish) {
return 301 /es;
}

location /es {}

location /en {}

try_files $uri $uri/ /index.php?ctr=$uri;
}

include /usr/local/nginx/conf/staticfiles.conf;
include /usr/local/nginx/conf/php.conf;
include /usr/local/nginx/conf/drop.conf;
}


_______________________________________________
nginx mailing list
[hidden email]
http://mailman.nginx.org/mailman/listinfo/nginx
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: rewrite don't work in a multilanguage MVC site

Francis Daly
In reply to this post by Fernando García Torres
On Tue, Oct 25, 2011 at 06:56:05PM +0200, Fernando García Torres wrote:

Hi there,

>     RewriteEngine On
>     RewriteCond %{HTTP:Accept-Language} ^en [NC]    RewriteRule ^$ /en/ [L,R=301]
>     RewriteCond %{HTTP:Accept-Language} ^es [NC]    RewriteRule ^$ /es/ [L,R=301]
>     RewriteCond %{REQUEST_FILENAME} !-f    RewriteCond %{REQUEST_FILENAME} !-d    RewriteRule (.*) index.php?ctr=$1 [QSA,L]

If I read this right, it only redirects the request for "/" to "/en/" or
"/es/" if the Accept-Language header begins with one of those strings;
otherwise, if the file-or-directory exists, serve it; otherwise, redirect
to index.php?ctr=(the original request).

Note that nginx and apache differ in the leading / of the url, so you'll
want to make sure that you allow for that. I'm going to assume that you
want to redirect to /index.php for all otherwise-404s.

Also note that you'll want to check whether apache writes
index.php?ctr=request or index.php?ctr=/request. The check what you
configure nginx to write, and see if it works too.

And as a final note -- checking the first two characters of
Accept-Language is not the right way to process that header. But it's
your site, and you get to do what you want on it.

> And this my translation to nginx:
>     location / {            if (-f $request_filename) {                      expires 30d;                      break;              }
>             if ($http_accept_language ~* "^es") {                    rewrite ^/$ /es/ permanent;                    break;            }
>             if ($http_accept_language ~* "^en") {                    rewrite ^/$ /en/ permanent;                    break;            }
>             if (!-e $request_filename) {                      rewrite (.*) /index.php?ctr=$1 last;              }      }

I suggest writing this as two locations:

        location = / {
          if ($http_accept_language ~* "^en") {
             return 301 /en/;
          }
          if ($http_accept_language ~* "^es") {
             return 301 /es/;
          }
        }

        location / {
          try_files $uri $uri/ /index.php?ctr=$uri;
        }

> location ~ \.php$ {            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;            ...

I would be more explicit, unless you have more php scripts:

        location = /index.php {
          fastcgi_pass unix:php.sock;
        }

with

        include fastcgi.conf;

at server level. But however you want to handle php is probably fine.

> With this, when I type http://site.com I'm being redirected to http://site.com/en/, great, but I get a 404 error, and in the error.log I have this line:
>     "/bla/bla/html/en/index.php" is not found

I get a 403 Forbidden, not a 404, so I must have some other configuration
difference from you.

> So, why is not nginx looking for the URI /index.php?ctr=/en/?    
Per the config, if the directory exists, it is served.

In my tests /en/ exists and returns 403, /ex/ doesn't and returns the
same content as /index.php?ctr=/ex/ does, apart from REQUEST_URI being
different.

Good luck with it,

        f
--
Francis Daly        [hidden email]

_______________________________________________
nginx mailing list
[hidden email]
http://mailman.nginx.org/mailman/listinfo/nginx
Loading...