.htacces (x2) to nginx rewrite - different rules in subdirectory (RazorCMS) - .htaccess

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; } }

Related

Nginx server config URL rewrite to /backend and /frontend directories

I am trying to convert .htaccess file to a nginx server config.
There is default client side site which is served from - /frontend/public - this works fine.
There is admin CMS side site which is served from - /backend/public - this doesn't work
If I go to /cms then I get redirected to /cms/login which is correct. Nginx displays 404 error though which is not correct.
If I remove login requirement and go to /cms then it displays the web page as expected, but url changes from /cms to /backend/public.
I am not sure what I got wrong with the /cms and /backend/public in the nginx config.
nginx config:
server {
listen 80;
root /home/anon/web/project;
index index.php index.html index.htm index.nginx-debian.html;
server_name project.test;
location ~ ^/cms$ {
rewrite ^(.*)$ /cms/ redirect;
}
location /cms {
rewrite ^/cms(.*)$ /backend/public/$1 last;
}
location /backend/public {
if (!-e $request_filename) {
rewrite ^(.*)$ /index.php;
}
}
location / {
if (!-e $request_filename) {
rewrite ^/(.*)/$ /$1 redirect;
}
if (!-e $request_filename) {
rewrite ^(.+)$ /frontend/public/$1 break;
}
rewrite ^/[a-zA-Z0-9_/\-'"$]*$ /frontend/public/index.php last;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
fastcgi_buffering off;
}
}
.htaccess file I am trying to convert into nginx config:
Options -Indexes
RewriteEngine on
RedirectMatch 301 ^/cms$ /cms/
RewriteRule ^cms(.*)$ backend/public/$1 [L]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ /$1 [R=301,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{DOCUMENT_ROOT}/frontend/public/%{REQUEST_URI} -f
RewriteRule ^(.+)$ frontend/public/$1 [L]
RewriteRule ^[a-zA-Z0-9_/\-'"$]*$ frontend/public/index.php [L]

How to convert .htaccess RewriteRule for Nginx

I'm trying to change the way pagination looks like, from: example.com/category?page=1 to example.com/category/page1/
For these purpose in .htaccess I was using this rule:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^((.*)/page([0-9]+)/)$ index.php?q=$2&page=$3 [L,QSA]
But I don't understand how to do it in nginx, I tried this:
location / {
if (!-e $request_filename){
rewrite ^/((.*)/page([0-9]+)/)$ /index.php?q=$2&page=$3 break;
}
}
And it doesn't work, it just breaks everything (getting 404 at categories)
Just use this
location / {
if (!-e $request_filename){
rewrite ^/((.*)/page([0-9]+)/)$ /index.php;
}
}

.htaccess to nginx conf

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;
}
}

Convert .htaccess to nginx rewrite rule

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;
}

.htaccess to nginx rewrite rules excluding certain folders

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.

Resources