I have this rule now:
RewriteRule ^/mp3/(.*)$ /music/$1 [L,R=301]
RewriteRule ^/activate/(.*) /index.php?p=activate.php&hash=$1 [QSA]
RewriteRule ^(.*)/([0-9]+)/(.*)$ index.php?p=$1&id=$2&page=$2 [QSA]
RewriteRule ^(.*)/([0-9]+)$ index.php?p=$1&id=$2&page=$2 [QSA]
RewriteRule ^(.*)/$ index.php?p=$1 [QSA]
But moved to Nginx, i've created these rules, but now working, i get 404 only:
location / {
rewrite ^/mp3/(.*) /music/$1 permanent;
rewrite ^/activate/(.*) /index.php?p=activate.php&hash=$1 permanent;
rewrite ^(.*)/([0-9]+)/(.*)$ index.php?p=$1&id=$2&page=$2 break;
rewrite ^(.*)/([0-9]+)$ index.php?p=$1&id=$2&page=$2 break;
rewrite ^(.*)/$ index.php?p=$1 break;
}
How to convert QSA rules to Nginx?
Unlike apache's mod_rewrite, you can match against the query string in nginx's rewrite command. So you'd want something like:
location / {
rewrite ^/mp3/(.*) /music/$1 permanent;
rewrite ^/activate/([^\?]*)(?:\?(.*))? /index.php?p=activate.php&hash=$1&$2 permanent;
rewrite ^(.*)/([0-9]+)/([^\?]*)(?:\?(.*))?$ index.php?p=$1&id=$2&page=$2&$3 break;
rewrite ^(.*)/([0-9]+)(?:\?(.*))?$ index.php?p=$1&id=$2&page=$2&$3 break;
rewrite ^(.*)/(?:\?(.*))?$ index.php?p=$1&$2 break;
}
Related
I have a few rewrite urls from .htaccess which not working anymore on nginx. both giving me 404
.htaccess urls:
RewriteRule ^password/reset?$ index.php?a=password&b=reset [L]
RewriteRule ^email/verification/(.*)?$ index.php?a=email&b=verification&hash=$1 [L]
nginx rewrite urls
rewrite ^/password/reset?$ index.php?a=password&b=reset break;
rewrite ^/email/verification/(.*)?$ index.php?a=email&b=verification&hash=$1 break;
Question is about translating RazorCMS (razorcms.co.uk) rewrite rule but I think answer can be general.
I have two .htacces files. First is in main directory (/). I translated:
RewriteRule ^(.*)$ index.php?path=$1 [L,QSA]
to
location / { try_files $uri $uri/ #rewrite; }
location #rewrite { rewrite ^/(.*)$ /index.php?path=$1; }
There is no problem with this one.
Second .htacces file is in subdirectory (/rars).
Content inside is:
RewriteRule ^login/u/(.*)/p/(.*)$ index.php?login=1&u=$1&p=$2 [L,QSA]
RewriteRule ^login index.php?login=1 [L,QSA]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?path=$1 [E=HTTP_AUTHORIZATION:%{HTTP:Authorization},L,QSA]
I tried to translate it to different rules:
location /login { rewrite ^/login/u/(.*)/p/(.*)$ /index.php?login=1&u=$1&p=$2 break; }
location /login { rewrite ^/login /index.php?login=1 break; }
location /rars { if (!-e $request_filename){ rewrite ^(.*)$ /index.php?path=$1; } }
...but it doesn't work.
How can I translate .htaccess rules to Nginx rewrites if second .htaccess is in subdirectory? Can you point me in right direction?
Nginx doesn't have per directory contexts, so you need to give the full path in the location. Try:
location /rars/login { rewrite ^/rars/login/u/(.*)/p/(.*)$ /rars/index.php?login=1&u=$1&p=$2 break; }
location /rars/login { rewrite ^/rars/login$ /rars/index.php?login=1 break; }
location /rars { if (!-e $request_filename){ rewrite ^/rars/(.*)$ /rars/index.php?path=$1; } }
I have this .htaccess rewrite rules
AddDefaultCharset UTF-8
RewriteEngine On
RewriteRule ^(administrator) - [L]
RewriteRule ^$ public/ [L]
RewriteRule (.*) public/$1 [L]
and the nginx version rewrite rules
charset utf-8;
rewrite ^/$ /public/ last;
rewrite /(.*) /public/$1 last;
location ~* ^/(administrator) {
break;
}
The current .htaccess redirect all requests to /public folder except /administrator request.
With the nginx rules the [domain.tld/rss.php not working] [domain.tld/administrator working] [domain.tld working] [File not found.]
My application stracture is
.
..
index.php [require public/index.php]
administrator/index.php
public/index.php
public/rss.php
public/css
public/js
Sepcifiy an index file : index index.php.
By the way you should put rewrite in locations to avoid the test for every request. It's also better for readability/maitainability.
server {
server_name domain.tld;
root /path/to/root;
location ~ /(administrator|public) {
index index.php;
...
}
location / {
rewrite ^/$ /public/ last;
rewrite ^(.*)$ /public/$1 last;
}
}
I'm attempting to convert the following (PHPVibe) .htaccess rule to gninx:
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteBase /
RewriteRule ^embed/([^/]*)/$ /embed.php?id=$1 [L]
RewriteRule ^feed(.*)$ feed.php [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/?$ index.php?rp=$1 [L]
</IfModule>
<ifModule mod_headers.c>
Header set Access-Control-Allow-Origin: *
</ifModule>
This is what I have so far:
rewrite ^/embed/([^/]*)/$ /embed.php?id=$1 last;
rewrite ^/feed(.*)$ /feed.php last;
if (!-f $request_filename){
set $rule_2 1$rule_2;
}
if (!-d $request_filename){
set $rule_2 2$rule_2;
}
if ($rule_2 = "21"){
rewrite ^/(.*)/?$ /index.php?rp=$1 last;
}
The above worked for the most part, except for the fact that it is returning 404 on my non mod_rewrite dependent pages.
Try inserting the following code before your other RewriteRules
RewriteRule ^moderator - [NC]
It should cause the rewrite engine to skip over any URLs that begin with /moderator/
location / {
try_files $uri $uri/ #index;
}
location /embed/ {
rewrite ^/embed/([^/]+)/$ /embed.php?id=$1;
}
location /feed {
rewrite ^ /feed.php;
}
location #index {
rewrite ^/(.*)/?$ /index.php?rp=$1;
}
location ~ \.php$ {
# fastcgi directives
}
So, after some tweaking, I've finally figured out the proper rewrite directives for nginx. In case anyone is wondering.
rewrite ^/embed/([^/]*)/$ /embed.php?id=$1 last;
rewrite ^/feed(.*)$ /feed.php last;
if (!-e $request_filename)
{
rewrite ^/(.*)/?$ /index.php?rp=$1 last;
}
So im trying to move an application from apache to NginX but I've discovered i need to re write the .htaccess file, I've had a good look around but finally I need to ask for some help.
Below is the .htaccess file from apache, im trying to redirect all requests to index.php except for requests to /html, /css, /images, /php.
Thanks for your help in advance!
Bill
RewriteEngine on
RewriteRule ^html [L,NC]
RewriteRule ^css [L,NC]
RewriteRule ^images [L,NC]
RewriteRule ^php [L,NC]
RewriteRule ^.*$ index.php [L,QSA]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !directory/(.*)$
RewriteCond %{REQUEST_URI} !(.*)$
RewriteRule ^(.*)$ http://www.domain.com/$1 [R=301,L]
So far I have the below and the requests for the html, css, images and php files are working great.
But when i make a request for www.domain.com/blah/blah/blah/ im getting a 404, what i really want is for the URL to reamin as www.domain.com/blah/blah/blah/ but load the index.php file
location ~ directory/(.*)$ {
}
location ~ (.*)$ {
}
location /html {
rewrite ^/html / break;
}
location /css {
rewrite ^/css / break;
}
location /images {
rewrite ^/images / break;
}
location /php {
rewrite ^/php / break;
}
location / {
rewrite ^(.*)$ /index.php break;
if (!-e $request_filename){
rewrite ^(.*)$ http://www.domain.com/$1 redirect;
}
}
Try something along these lines for filtering requests to content in specific folders:
RewriteEngine On
# if not requesting content in one of the specified folders
RewriteCond %{REQUEST_FILENAME} !^(html|css|images|php)/ [NC]
# redirect visitor to the index page
RewriteRule ^(.*)$ index.php [L,QSA]
The exclamation mark ( ! ) before the rewrite condition means a negation, so if the requested filename DOES NOT start with html or css or ...., apply the rewrite rule.