|
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 |
|
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 |
|
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 |
|
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 |
|
> 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 |
|
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 |
| Powered by Nabble | Edit this page |
