php - .htaccess url rewriting to remove action names from urls ← (PHP, HTML)

I have my urls like this

domain.com/index.php?id=126&action=Category&name=Vegetables

I want my urls to look like this

domain.com/126/Category/Vegetables

I have tried a lot using .htaccess but could not able to do.

Your help and suggestion required.

Answer



Solution:

Sounds pretty straight forward:

RewriteEngine on
RewriteRule ^/?(\d+)/([^/]+)/([^/]+)$ /index.php?id=$1&action=$2&name=$3 [END]

In case you receive an internal server error (http status 500) using the rule above then chances are that you operate a very old version of the apache http server. You will see a definite hint to an unsupported [END] flag in your http servers error log file in that case. You can either try to upgrade or use the older [L] flag, it probably will work the same in this situation, though that depends a bit on your setup.

This implementation will work likewise in the http servers host configuration or inside a distributed configuration file (".htaccess" file). Obviously the rewriting module needs to be loaded inside the http server and enabled in the http host. In case you use a distributed configuration file you need to take care that it's interpretation is enabled at all in the host configuration and that it is located in the host's DOCUMENT_ROOT folder.

And a general remark: you should always prefer to place such rules in the http servers host configuration instead of using distributed configuration files (".htaccess"). Those distributed configuration files add complexity, are often a cause of unexpected behavior, hard to debug and they really slow down the http server. They are only provided as a last option for situations where you do not have access to the real http servers host configuration (read: really cheap service providers) or for applications insisting on writing their own rules (which is an obvious security nightmare).

Answer



Solution:

<IfModule mod_rewrite.c>
 
RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ /$1 [L,R] 

RewriteCond %{THE_REQUEST} \ /(.*/|)(?:index\.php)?\?name=([^\s&]+) [NC]
RewriteRule ^ /%1%2/? [R=302,L,NE]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !index\.php
RewriteRule ^(.*/|)([^/]*)$ $1index.php?name=$2/ [L]

RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301,NE]
Header always set Content-Security-Policy "upgrade-insecure-requests;"

</IfModule>

Source