1

Hi there anyone happens to know Nginx rewrite rules?

I'm trying to convert this Apache .htaccess to Nginx Rewrite, I already tried with online converters

the homepage and dashboard once logged in work fine but the: news, list, video, music, polls and quiz sections aren't working they give 404

I have 32 hours non-stop without sleep setting up the server it's driving me crazy

any help would be greatly appreciated

here’s the Apache .htaccess that I want to convert:

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^$ index.php?link1=home [NC,QSA]
RewriteRule ^news/(.*)$ index.php?link1=news&id=$1 [NC,QSA]
RewriteRule ^lists/(.*)$ index.php?link1=lists&id=$1 [NC,QSA]
RewriteRule ^polls/(.*)$ index.php?link1=polls&id=$1 [NC,QSA]
RewriteRule ^quiz/(.*)$ index.php?link1=quiz&id=$1 [NC,QSA]
RewriteRule ^videos/(.*)$ index.php?link1=videos&id=$1 [NC,QSA]
RewriteRule ^music/(.*)$ index.php?link1=music&id=$1 [NC,QSA]
RewriteRule ^edit-post/(.*)$ index.php?link1=edit-post&id=$1 [NC,QSA]
RewriteRule ^delete-post/(.*)$ index.php?link1=delete-post&id=$1 [NC,QSA]
RewriteRule ^settings/(.*)/(.*)$ index.php?link1=settings&page=$1&user=$2 [NC,QSA]
RewriteRule ^settings/(.*)$ index.php?link1=settings&page=$1 [NC,QSA]
RewriteRule ^admin-cp$ admincp.php [NC,QSA]
RewriteRule ^admin-cp/(.*)$ admincp.php?page=$1 [NC,QSA]
RewriteRule ^admincp/(.*)$ index.php?link1=admincp&page=$1 [NC,QSA]
RewriteRule ^admin-cdn/(.*)$ admin-panel/$1 [L]
RewriteRule ^tags/(.*)$ index.php?link1=tags&tag=$1 [NC,QSA]
RewriteRule ^feeds/rss(/?|)$ index.php?link1=feeds&page=home [NC,QSA]
RewriteRule ^post_data/(.*)/(.*)(/?|)$ index.php?link1=post_data&post_type=$1&id=$2 [NC,QSA]

RewriteRule ^terms/(.*)$ index.php?link1=terms&type=$1 [NC,QSA]
RewriteRule ^go_pro(?:\/{0,1}|)$ index.php?link1=go_pro [NC,QSA]

RewriteRule ^latest-(.*)/(\d+)$ index.php?link1=latest-$1&c_id=$2 [NC,QSA]
RewriteRule ^latest-(.*)/rss(/?|)$ index.php?link1=rss&page=$1 [NC,QSA]

RewriteRule ^ads(?:\/?|)$ index.php?link1=ads [NC,QSA]
RewriteRule ^ads/create-new(?:\/?|)$ index.php?link1=create_ad [NC,QSA]
RewriteRule ^ads/edit/([0-9]+)(?:\/?|)$ index.php?link1=edit_ad&ad_id=$1 [NC,QSA]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^@([^\/]+)(\/|)$ index.php?link1=profile&u=$1 [QSA]
RewriteRule ^@([^\/]+)(\/|)/(.*)$ index.php?link1=profile&u=$1&page=$2 [QSA]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^\/]+)(\/|)$ index.php?link1=$1 [QSA]

<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE text/javascript
AddOutputFilterByType DEFLATE text/xml
AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE image/x-icon
AddOutputFilterByType DEFLATE image/svg+xml
AddOutputFilterByType DEFLATE application/rss+xml
AddOutputFilterByType DEFLATE application/javascript
AddOutputFilterByType DEFLATE application/x-javascript
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE application/x-font
AddOutputFilterByType DEFLATE application/x-font-truetype
AddOutputFilterByType DEFLATE application/x-font-ttf
AddOutputFilterByType DEFLATE application/x-font-otf
AddOutputFilterByType DEFLATE application/x-font-opentype
AddOutputFilterByType DEFLATE application/vnd.ms-fontobject
AddOutputFilterByType DEFLATE font/ttf
AddOutputFilterByType DEFLATE font/otf
AddOutputFilterByType DEFLATE font/opentype
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
</IfModule>

here is the auto-converted file (partially working, after some of my editions, based on 3 hours reading Nginx Docs)

location / {
  if (!-e $request_filename){
    rewrite ^/$ /index.php?link1=home;
  }
  rewrite "^/go_pro(?:\/{0,1}|)$" /index.php?link1=go_pro;
  if (!-e $request_filename){
    rewrite ^/@([^\/]+)(\/|)$ /index.php?link1=profile&u=$1;
  }
  rewrite ^/@([^\/]+)(\/|)/(.*)$ /index.php?link1=profile&u=$1&page=$2;
  if (!-e $request_filename){
    rewrite ^/([^\/]+)(\/|)$ /index.php?link1=$1;
  }
}


(**_not working from here and below news, list, video, music, polls and quiz sections_**)

location /news {
  rewrite ^/news/(.*)$ /index.php?link1=news&id=$1;
}

location /lists {
  rewrite ^/lists/(.*)$ /index.php?link1=lists&id=$1;
}

location /polls {
  rewrite ^/polls/(.*)$ /index.php?link1=polls&id=$1;
}

location /quiz {
  rewrite ^/quiz/(.*)$ /index.php?link1=quiz&id=$1;
}

location /videos {
  rewrite ^/videos/(.*)$ /index.php?link1=videos&id=$1;
}

location /music {
  rewrite ^/music/(.*)$ /index.php?link1=music&id=$1;
}

location /edit {
  rewrite ^/edit-post/(.*)$ /index.php?link1=edit-post&id=$1;
}

location /delete {
  rewrite ^/delete-post/(.*)$ /index.php?link1=delete-post&id=$1;
}

location /settings {
  rewrite ^/settings/(.*)/(.*)$ /index.php?link1=settings&page=$1&user=$2;
  rewrite ^/settings/(.*)$ /index.php?link1=settings&page=$1;
}

(**_admin panel and the other admin, term, ads, latest,tags and feed and all rest sections below this line work fine_**)

location /admin {
  rewrite ^/admin-cp$ /admincp.php;
  rewrite ^/admin-cp/(.*)$ /admincp.php?page=$1;
}

location /admincp {
  rewrite ^/admincp/(.*)$ /index.php?link1=admincp&page=$1;
}

location /admin-cdn/ {
  alias /admin-panel/;
}

location /tags {
  rewrite ^/tags/(.*)$ /index.php?link1=tags&tag=$1;
}

location /feeds {
  rewrite ^/feeds/rss(/?|)$ /index.php?link1=feeds&page=home;
}

location /post_data {
  rewrite ^/post_data/(.*)/(.*)(/?|)$ /index.php?link1=post_data&post_type=$1&id=$2;
}

location /terms {
  rewrite ^/terms/(.*)$ /index.php?link1=terms&type=$1;
}

location /latest {
  rewrite ^/latest-(.*)/(\d+)$ /index.php?link1=latest-$1&c_id=$2;
  rewrite ^/latest-(.*)/rss(/?|)$ /index.php?link1=rss&page=$1;
}

location /ads {
  rewrite ^/ads(?:\/?|)$ /index.php?link1=ads;
  rewrite ^/ads/create-new(?:\/?|)$ /index.php?link1=create_ad;
  rewrite ^/ads/edit/([0-9]+)(?:\/?|)$ /index.php?link1=edit_ad&ad_id=$1;
}

If I made any mistake in the question; please forgive me I'm barely awake, I´m an Electronic Engineer, trying to set up a server front and backend for my IoT devices; I´m not a programmer but I greatly admire them, learned some basic WebDeV but this is my first time with Nginx Coding is not my strength and not everyone has been kind to me https://stackoverflow.com/questions/63078446/converting-htaccess-to-nginx-rewrite-autoconverting-not-working?noredirect=1#comment111550833_63078446

Any help would be greatly appreciated Thanks in advance

  • 1
    You should first go get some sleep! – Michael Hampton Jul 24 '20 at 22:46
  • Automatic converters usually make quite bad job on this, since the principles are quite different between nginx and Apache. Another issue is that the rules are quite complex, which makes conversion more difficult. – Tero Kilkanen Jul 25 '20 at 10:13

1 Answers1

1

You should follow this pattern for your sections:

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

location ~ ^/go_pro(?:\/{0,1}|)$ {
    try_files /index.php?link1=go_pro =404;
}

location ~ ^/news/(?<newsid>.*)$ {
    try_files /index.php?link1=news&id=$newsid =404;
}

This way of writing locations is easier to read and understand, and one doesn't need the if statements that are evil.

One needs to pay attention to location section processing order.

Tero Kilkanen
  • 36,796
  • 3
  • 41
  • 63
  • 1
    It worked, you rock buddy big thanks you saved me from many sleepless nights and yeah I removed those nasty ¨if¨ now the website runs fast can´t thank you enough – Elin Digente Jul 26 '20 at 18:38