URL Rewrite is not working in Nginx - .htaccess

URL rewrite is not working in Nginx and operating system is Ubuntu 12.4 Lts
when open http://mvc.loc it is working
but when i try to open http://mvc.loc/login Not working
404 Not Found
nginx/1.1.19
.htaccess
<IfModule !mod_rewrite.c>
ErrorDocument 500 "mod_rewrite must be enabled"
</IfModule>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php?u=$1
virtual hosts for mvc.loc
server {
listen 80;
server_name mvc.loc;
access_log /var/log/nginx/mvc.loc.access.log;
error_log /var/log/nginx/mvc.loc.error.log;
root /usr/share/nginx/www/mvc;
index index.php;
# use fastcgi for all php files
# Are you sure you have this set up?
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
# deny access to apache .htaccess files
location ~ /\.ht {
deny all;
}
}

location / {
rewrite ^(.*)$ /index.php?u=$1 last;
}

Well #NanheKumar's answer got the rewrite correct but it ignored the first 2 rules in the htaccess
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
This means check if the request doesn't match a file and doesn't match a directory, to imitate this exact behavior you can use try_files like this
location / {
try_files $uri $uri/ /index.php?u=$request_uri;
}
This will make sure to serve requests that point to an asset or a directory directly first then if neither it would pass the request to index.php
EDIT: unless index.php is able to serve assets, this will cause all assets ( images, css, javascript, etc ) to show errors because index.php will be receiving arguments it's not expecting. Think about something like this http://example.com/index.php?u=/images/background.jpg

Related

Apache .htaccess How to convert to nginx htaccess?

apache .htaccess
<IfModule mod_rewrite.c>
Options +FollowSymlinks -Multiviews
RewriteEngine On
RewriteCond %{HTTP:Authorization} ^(.+)$
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?/$1 [QSA,PT,L]
</IfModule>
Please help me. This problem has bothered me for 3 days. Thank you very much
I try to convert it into the following
if (!-e $request_filename){
rewrite ^/(.*)$ /index.php/$1 last;
}
Authorization cannot be obtained correctly on nginx,Can cause CORS problems
I think it's because this sentence hasn't been converted successfully
RewriteCond %{HTTP:Authorization} ^(.+)$
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
because I don't know how to convert it
Please help me
I expect to get the converted nginx htaccess
The .htaccess you're seeking to convert is quite standard "front controller" pattern. What it does is, for any URI, it will attempt to:
serve the file matching the exact URI
if the file wasn't found in the previous step, then check a directory, and attempt to serve from there (subject to index directives or further rewrites)
if the directory wasn't found, route the request to index.php
The de-facto standard NGINX snippet that does the same, utilizes try_files directive.
You'll find this used for virtually all PHP-based CMS configs for NGINX:
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
The try_files directive, similar to if when being checked for file existence, has its performance pitfalls, so in fact, you may want to do as the article says is route unconditionally all request via PHP-FPM by default, then some (e.g. static assets) served by NGINX directly. Example bare-bones config for WordPress which illustrates the idea:
index index.html index.php;
location / {
fastcgi_param SCRIPT_FILENAME $document_root/index.php;
include fastcgi_params;
# override SCRIPT_NAME which was set in fastcgi_params
fastcgi_param SCRIPT_NAME /index.php;
fastcgi_pass unix:/var/run/php-fpm/example.com.sock;
}
location /wp-content/ { }
In this case /wp-content/ is allocated as an empty location in order to ensure NGINX does not pass requests to files in it via PHP-FPM. It will serve everything directly for static files.
Thus the URL rewriting is actually eliminated, and all the performance penalty that comes with it is negated.
This is the answer
if (!-f $request_filename) {
rewrite ^(.*)$ /index.php?s=/$1 last;
break;
}
if (!-d $request_filename) {
rewrite ^(.*)$ /index.php?s=/$1 last;
break;
}

Translating rewriting from htaccess to nginx

I have .htaccess:
RewriteRule ^thumb/(.*)x(.*)/r/(.*) thumb.php?w=$1&h=$2&src=$3
RewriteRule ^medias/(.*) files.php?file=$1
RewriteRule ^sitemap\.xml$ index.php [L]
RewriteRule ^(.*)(\.html|\.htm)$ index.php [L]
RewriteRule ^(.*)(\.rss|\.atom|\.txt)$ index.php [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/?$ index.php [L]
Nginx rewriting is:
rewrite ^/thumb/(.*)x(.*)/r/(.*) /thumb.php?w=$1&h=$2&src=$3;
rewrite ^/medias/(.*) /files.php?file=$1;
rewrite ^/sitemap\.xml$ /index.php break;
rewrite ^/(.*)(\.html|\.htm)$ /index.php break;
rewrite ^/(.*)(\.rss|\.atom|\.txt)$ /index.php break;
When accessing categories, I get the home page.
Any help please
Thanks
Nginx configuration is typically approached a bit differently, with lots of location blocks.
It's difficult for me to test this, but this might help you forward:
# Nginx excludes the query string (part after the ?) before trying to match
location = /index.php {
# FastCGI PHP stuff here
}
location ~ ^/thumb/([^/]+)x([^/]+)/r/([^/]+) {
rewrite ^ /thumb.php?w=$1&h=$2&src=$3 break;
}
location ~ ^/medias/(.*) {
rewrite ^ /files.php?file=$1 break;
# To be honest I would try to avoid serving files through PHP. It's much more efficient to let Nginx serve them directly with something like:
root /path/to/media's/parent;
try_files $uri =404;
}
location ~ ^/sitemap\.xml$ {
rewrite ^ index.php break;
}
location ~ (\.html|\.htm|\.rss|\.atom|\.txt)$ {
rewrite ^ index.php break;
}
# Catch-all
location / {
try_files $uri index.php;
}
The fact that you have to test for extensions, with regexes, means they kind of all have to use regexes. That's because those blocks with regexes are evaluated before longest-prefix blocks. Make sure to read Nginx' documentation about location blocks for a better explanation, with examples.

Migrating: Kohana .htaccess to nginx

I'm not a developer. I'm helping a friend to use a instance server at Amazon (Ubuntu) and I need a help to convert the .htaccess to nginx configs. I tried any sites that promise the automatic convertion, but without success. Can You help me in this case, please?
This is the .htaccess:
#http://# Turn on URL rewriting
RewriteEngine On
# Installation directory
RewriteBase /
# Protect hidden files from being viewed
<Files .*>
Order Deny,Allow
Deny From All
</Files>
# Protect application and system files from being viewed
RewriteRule ^(?:application|modules|system)\b.* index.php/$0 [L]
# Allow any files or directories that exist to be displayed directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# Rewrite all other URLs to index.php/URL
RewriteRule .* index.php/$0 [PT]
Thanks a lot
server {
listen 80;
server_name www.site.dev *.site.dev;
root /var/www/site/public_html/;
location / {
expires off;
try_files $uri $uri/ #kohana;
}
# Prevent access to hidden files
location ~ /\. {
deny all;
}
location #kohana {
rewrite ^/(.+)$ /index.php$request_uri last;
}
location ~* \.php {
#fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param KOHANA_ENV development;
fastcgi_cache off;
fastcgi_index index.php;
}
}
Source: https://github.com/primalskill/kohana-nginx-config

Nginx Rewrite Multiple Query Parameters

I am having problems creating a rewrite rule that match my .htaccess on Nginx, I am hoping someone can point me to the right direction.
My .htaccess
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond $1 !^(index\.php|robots\.txt|app|assets|upload|api)
RewriteRule ^([^/]+)(?:/([^/]+)|)(?:/([^/]+)|)(?:/([^/]+)|) index.php?class=$1&action=$2&param=$3 [L]
My nginx configuration
location / {
rewrite ^/([^/]+)(?:/([^/]+)|)(?:/([^/]+)|)(?:/([^/]+)|) /index.php?class=$1&action=$2&param=$3 break;
}
Query params are optional for example:
site.com/
site.com/customers
site.com/customers/add
site.com/customers/edit/1
I cannot rewrite the app code since iam only migrating from apache to nginx.
Any help will be appreciated.
Thanks.
You could structure the solution like this:
root /path/to/root;
index index.php;
location / {
try_files $uri $uri/ #rewrite;
}
location #rewrite {
rewrite ^/([^/]+)(?:/([^/]+)|)(?:/([^/]+)|)(?:/([^/]+)|) /index.php?class=$1&action=$2&param=$3 last;
return 404;
}
location ~ \.php$ {
try_files $uri =404;
# fastcgi stuff
}
I have not checked your regular expression. The try_files directive is documented here.

Migrate Kohana from Apache to NginX

I'm migrating a Kohana App version 3.0.4 from Apache to NginX.
I'm getting troubles with the configuration .htaccess. On NginX work correctly only the internal URL's like:
http://myurlwithoutwww.net.ds/internalpage/anotherpage
but nether the homepage
http://myurlwithoutwww.net.ds/
nether this:
http://myurlwithoutwww.net.ds/index.php
works. The last two will simply display a blank screen.
this is the htaccess file from where I'm trying to migrate:
AddType text/x-component .htc
#Accept-Encoding: filter,deflate
# Turn on URL rewriting
RewriteEngine On
AddDefaultCharset UTF-8
# Installation directory
RewriteBase /
RewriteCond %{HTTP_HOST} ^([a-z0-9\-]+).([a-z]{2,3})$ [NC]
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [L,R=301]
# Protect hidden files from being viewed
<Files .*>
Order Deny,Allow
Deny From All
</Files>
# ExpiresActive On
# <FilesMatch \.(bmp|png|gif|jpe?g|html?|ico|doc|swf)$>
# ExpiresDefault "access plus 10 days"
# </FilesMatch>
FileETag none
# Protect application and system files from being viewed
RewriteRule ^async/?(.*)? index.php?dispatcher=async&$1 [NC,L,QSA]
RewriteRule ^(?:_application|_modules|_system)\b index.php/$0 [L]
# Allow any files or directories that exist to be displayed directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# Rewrite all other URLs to index.php/URL
RewriteRule .* index.php?kohana_uri=$0 [PT,L,QSA]
#RewriteRule .* index.php/$0 [PT]
And this my current Nginx configuration:
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
include /etc/nginx/aliases.conf;
root /var/www/webroot/ROOT;
index index.php;
location / {
expires off;
try_files $uri $uri/ #kohana;
}
# Prevent access to hidden files
location ~ /\. {
deny all;
}
location #kohana {
rewrite ^/(.+)$ /index.php$request_uri last;
}
location ~* \.php {
#location ~ /\. { deny all; access_log off; log_not_found off; }
include /etc/nginx/fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME /var/www/webroot/ROOT/$fastcgi_script_name;
fastcgi_param KOHANA_ENV development;
fastcgi_param PATH_INFO $fastcgi_script_name;
fastcgi_param DOCUMENT_ROOT /var/www/webroot/ROOT;
fastcgi_index index.php;
}
try below config, also check bootstrap init if it has 'index_file' => FALSE.
server {
listen 80;
server_name *.domain.com;
client_max_body_size 20M;
access_log /home/user/public_html/site/log/access.log;
error_log /home/user/public_html/site/log/error.log;
root /home/user/public_html/site/public/;
index index.php;
location / {
# don’t check $uri/, send to php for nice error message
try_files $uri /index.php?$query_string;
}
location = /index.php {
include fastcgi.conf;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
}
}
It is pretty old question, but maybe you will find it useful, the way I do:
location / {
index index.html index.htm index.php;
try_files $uri index.php;
}
location /kohana {
rewrite ^(.+)$ /kohana/index.php?kohana_uri=$1 last;
if (-f $request_filename) {
break;
}
if (!-e $request_filename) {
rewrite ^/kohana/(.+)$ /kohana/index.php?kohana_uri=$1 last;
}
}
I just listed the main sections of default.conf.

Resources