Converting htaccess to Nginx ReWrite (autoconverting not working)

Server Fault Asked by Elin Digente on January 5, 2022

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/
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

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

Any help would be greatly appreciated
Thanks in advance

One Answer

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.

Answered by Tero Kilkanen on January 5, 2022

Add your own answers!

Ask a Question

Get help from others!

© 2024 All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP