Technik_Max
Technik_Max

Reputation: 91

How can I use mutliple url variables?

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

Answers (2)

arkascha
arkascha

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

bluemoon6790
bluemoon6790

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

Related Questions