Reputation: 91
I will convert URL's like those
example.com/tasks.php?action=list
example.com/tasks.php?action=detail&id=48
example.com/tasks.php?action=add&name=Test
into those
example.com/tasks/list
example.com/tasks/detail/48
example.com/tasks/add?name=Test
So, I need two variables, but the second must be optional, the file extension must be hidden and I need to add get variables.
Upvotes: 1
Views: 31
Reputation: 42915
Well, you can simply implement different rewriting rules for those three separate situations. That keeps the rules simple and clear, so easy to maintain:
RewriteEngine on
RewriteRule ^/?tasks/([^/]+)/?$ /tasks.php?action=$1 [END]
RewriteRule ^/?tasks/([^/]+)/(\d+)$ /tasks.php?action=$1&id=$2 [END]
RewriteRule ^/?tasks/([^/]+)/([^/]+)/([^/]+)/?$ /tasks.php?action=$1&$2=$3 [END]
That will implement these rewritings:
/tasks/list => /tasks.php?action=list
/tasks/detail/48 => example.com/tasks.php?action=detail&id=48
/tasks/add/name/Test => example.com/tasks.php?action=add&name=Test
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 rule will work likewise in the http servers host configuration or inside a dynamic 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 dynamic 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 dynamic configuration files (".htaccess"). Those dynamic 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).
Upvotes: 0
Reputation: 487
So, I stole the base from someone's GitHub page (here):
Original URL:
http://www.example.com/index.php?category=fish
Desired destination URL:
http://www.example.com/category/fish/
.htaccess syntax:
RewriteEngine On
RewriteRule ^/?category/([^/d]+)/?$ index.php?category=$1 [L,QSA]
You can just add another parameter. With multiple parameters:
RewriteEngine On
RewriteRule ^/?tasks/([A-Za-z]{0,})/?$ tasks.php?action=$1 [L,QSA]
RewriteRule ^/?tasks/([A-Za-z]{0,})/([0-9]{0,})/?$ tasks.php?action=$1&id=$2 [L,QSA]
With this, you can publish the pretty version of the links, and the server will direct traffic to the URLs with the GET parameters, behind the scenes.
EDIT: The first rule will catch your 3rd case by default because of the QSA.
Upvotes: 1