Forum Moderators: phranque

Message Too Old, No Replies

htaccess

htaccess and PHP

         

herci

8:17 am on Apr 19, 2012 (gmt 0)

10+ Year Member



Hi,
I have the below htaccess rule;
RewriteRule ^(.+)-(.+)\.php?$ category.php?cdesc=$1&cid=$2

It allows me to present this link;
/Birthday-16.php

and translate to this;
category.php?cdesc=$1&cid=$2

Now I want to do the following to GET the "sorttype" and "refine" and the "page" values but don't know how to do it in the htaccess.
/Birthday-16.php?sorttype=1
/Birthday-16.php?sorttype=1&refine=10&page=12

I've tried something like this but looks like it's not correct.
RewriteRule ^(.+)-(.+)\.php?sorttype=(.+)$ category.php?cdesc=$1&cid=$2&sorttype=$3

Thanks.

lucy24

9:25 am on Apr 19, 2012 (gmt 0)

WebmasterWorld Senior Member 10+ Year Member Top Contributors Of The Month



:: shuffling papers ::

Query Strings

The Query String, also known as a Parameter, is the part of an url after the question mark. Question = query.

By default, rewrites simply ignore the query string. That is, mod_rewrite stashes the query in a safe place, does its stuff to the part before the question mark, and then reappends the original query.

Changing a Query

#1 To delete a query, add a ? to the end of your rewrite target.
#2 To replace a query—or create a new one—add ?blahblah to the rewrite target. The blahblah can be either literal text, or stuff you captured earlier. (#1 and #2 are really the same thing: you're just replacing the query with either something or nothing.)
#3 To add to an existing query, again put ?blahblah at the end of the target, but also add [QSA] to your flags (the bracketed items at the end of the Rule). It stands for "Query String Append", meaning that the blahblah is to be added to the existing query—if any—instead of replacing it.

Getting the Query

You only need to retrieve the original query if
#1 you want the rewrite to behave differently depending on what the query was
or
#2 you need to change or delete the query

Add a Condition that says

RewriteCond %{QUERY_STRING} blahblah


using your ordinary Regular Expressions, anchors and ! as needed.

To test whether there was a query at all

RewriteCond %{QUERY_STRING} .


which simply means "If the query contains at least one character of any kind".

If you need to capture any of the query, use parentheses as usual. In the rewrite target, the captures will be %1, %2 etc instead of $1, $2 etc, because they are coming from a Condition instead of the Rule. Each set is separately numbered, so the first capture from the Rule will still be $1.

herci

4:28 pm on Apr 19, 2012 (gmt 0)

10+ Year Member



Thank you so much for the reply. It did work for me now. Great explanation

g1smd

1:36 pm on Apr 23, 2012 (gmt 0)

WebmasterWorld Senior Member 10+ Year Member Top Contributors Of The Month



^(.+)-(.+)\.php?$ matches a request ending with .php or .ph - is that what you really want?

^(.+)-(.+)\. is probably not the right pattern to use.
^([^-]+)-([^.]+)\. or similar, would likely be better.