get variables in query string re_writes - php

I am trying to combine these four get variables (sch, val, lmt, ord) into a nice looking url re_write. Currently I have the following in my .htaccess file and it works if all variables are included, however, if I only input the first two variables (sch & val) it breaks:
RewriteRule ^search/([^/]*)/([^/]*)/([^/]*)/([^/]*)$
search.php?sch=$1&val=$2&lmt=$3&ord=$4 [L]
www.domain.com/search/City/London/5/asc works
www.domain.com/search/City/London but this doesn't

Why not just add the other rewrite rules ahead of it. IE:
RewriteRule ^search/([^/]*)$
search.php?sch=$1 [L]
RewriteRule ^search/([^/]*)/([^/]*)$
search.php?sch=$1&val=$2 [L]
RewriteRule ^search/([^/]*)/([^/]*)/([0-9]*)$
search.php?sch=$1&val=$2&lmt=$3 [L]
RewriteRule ^search/([^/]*)/([^/]*)/([0-9]*)/([^/]*)$
search.php?sch=$1&val=$2&lmt=$3&ord=$4 [L]
That should work. Not sure if it is what you want, but I do not really think it is "possible" to do that without just doing a query and passing the full query string as one line then parsing it PHP side.
EDIT
The nice thing about doing all this in .htaccess vs PHP is it requires less logic and you pass what you want to your script in the correct values. My preference would be using the .htaccess above.

you can use this , to grab whole path as text and parse
www.domain.com/search/City/London/5/asc works www.domain.com/search/City/London but this doesn't
RewriteRule ^search/(.*)$ search.php?url=$1
$paths=explode('/',$_GET('url'));
output
www.domain.com/search/City/London/5/asc
$paths=city,london,5,asc
www.domain.com/search/City/London
$paths=city,london
You can use loop and pair as key/value... if needed

Related

How to manage long integer value in url

I have a id parameter in the url and it looks like
http://localhost/project/index.php?id=20234532
The problem is this number can be grown up to a bigger number within few days.
First thought : If there is any way to remove the id value from url using htaccess then that's fine.Not sure though.
Second thought : If the value 20234532 can be encoded in a shorter value and then decode again.
I can't think of any other possible idea now.Also I can't use post method as this id will come in the url always.
Apologies, if I put the question in wrong place as clearly it is not an issue rather seeking for solution.
A number of things you can do here. You can convert it to base 32, and make the URL even short by using mod_rewrite:
$id = (whatever comes out of database)
$shortID = base_convert($id,10,32);
Then use the $shortID to make the URL: http://example.com/$shortID, so maybe something that looks like http://example.com/a5pqnf3k (that's ID = 349832985716).
Then in your htaccess file:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)$ /index.php?shortID=$1 [L,QSA]
Then when you check the "shortID" you'd just reverse it to get the long ID:
$shortID = $_GET['shortID'];
$id = base_convert($shortID,32,10);

Apache .htaccess regex for GET param

I have a similar rule in my .htaccess
RewriteRule ^news/([0-9]+)/([0-9]+)/([0-9]+)/(.*)/$ /?name=$4&year=$1&monthnum=$2&day=$3
Example
http://www.example.com/news/2014/02/25/stackoverflow-is-cool/
Now I am required to add in extra parameter at the back such that it looks like
http://www.example.com/news/2014/02/25/stackoverflow-is-cool/?source=email
I wish to get the source value and I tried the following:
RewriteRule ^news/([0-9]+)/([0-9]+)/([0-9]+)/([^/]*)/\?source=(.*)$ /?name=$4&year=$1&monthnum=$2&day=$3&source=$5
but it's not working. Any advice?
Thank you.
I haven't tried this myself, can you please give it a try
RewriteRule ^news/([0-9]+)/([0-9]+)/([0-9]+)/(.*)/$ /?name=$4&year=$1&monthnum=$2&day=$3 [QSA]
The [QSA] Query String Append flag will retain the existing query strings. So your query string
http://www.example.com/news/2014/02/25/stackoverflow-is-cool/?source=email
Should get converted to
/?source=email&name=$4&year=$1&monthnum=$2&day=$3
Please give it a try.
Try
RewriteRule ^news/([0-9]+)/([0-9]+)/([0-9]+)/([^/]*)/\?$ /?name=$4&year=$1&monthnum=$2&day=$3&source=$5
When you get source value..... just use
$SrcVal = str_replace('source=','',$_GET['source']);

htaccess rewrite rule with query string, multiple variables and no php file in the link

We're trying to migrate our forum to another platform and we have encountered links which have queries in them, such as
http://forum.test/threads/119312-Warnight-CS-GO?p=2306618&viewfull=1#post2306618
which has to point to http://forum.test/threads/warnight-cs-go.119312/#post-2306618
So the logical structure of the original link is :
http://{forum_base_url}/threads/{thread-id}-{thread-permalink}?p={post-id}&viewfull={post-number-in-thread}#post{post-id}
While the new one is:
http://{forum_base_url}/threads/{thread-permalink}.{thread-id}/#post-{post-id}
So for the rewrite to work we need to "pull" three things out of the original link: the thread-id, the permalink, and the post-id. The first two aren't an issue, it's the third one which doesn't want to cooperate.
After scouring the Internet for possible solutions, we came up with:
RewriteCond %{QUERY_STRING} ^p=(\d+)&viewfull=(\d+)#post(\d+)$
RewriteRule ^threads/([0-9]+)-(.*)$ /threads/$2\.$1/#post-%1? [R=301,NC,L]
But unfortunately, the rewrite doesn't work.
What throws us off regarding the rewrite is that there are multiple variables in the query and no .php file specified in the link itself, so we can't just use the solution offered here: https://stackoverflow.com/a/2252242/1288397
Any tips on how to overcome this particular hurdle?
The #post- part of the URL is never sent to the server, it remains entirely on the browser's end, so there's no way to match against it. Luckily, the post ID is already in the query string so you can ignore it:
RewriteCond %{QUERY_STRING} ^p=(\d+)&viewfull=(\d+)$
RewriteRule ^threads/([0-9]+)-(.*)$ /threads/$2\.$1/#post-%1? [R=301,NC,L]
The other thing is that the thread-permalink is lowercase in your second URL. Not sure if that matters or not, but in order to change text to lowercase, you need to use a Rewrite Map, and the tolower internal function. You can only declare maps in the server vhost/config, so if you don't have access to those config files, you're not going to be able to use maps.
Thanks for clearing up the #post- aspect.
I tried your modification, but the links initially became:
http://forum.test/threads/warnight-cs-go.119312/%23post-2306618#post2306618
In order to work, the rewrite needs to be
RewriteCond %{QUERY_STRING} ^p=(\d+)&viewfull=(\d+)$
RewriteRule ^threads/([0-9]+)-(.*)$ /threads/$2\.$1/#post-%1? [R=301,NC,NE,L]
Notice the additional NE (noscape) flag at the end
That's because, by default, special characters, such as & and ?, will be converted to their hexcode equivalent. Using the [NE] flag prevents that from happening, as seen here: http://httpd.apache.org/docs/2.2/rewrite/flags.html#flag_ne

PHP `$_GET` variables without the `?id=` [duplicate]

I know this is probably a common question and has been asked before but .htacess looks foreign to me and I can't seem to get this to work from looking at previous questions.
I have a index script that searches and the syntax is:
.../listing/?field=property_type&query=retail
I simply want to rewrite this to:
.../listing/{field}/{query}
One other catch, I have some fields that are boolean.. for example:
.../listings/?forlease=1
So in this case I just use isset() but would like to rewrite this to:
.../listings/forlease/
Thanks for your help as always! Stack Overflow rocks!
EDIT:
I see some good answers but completely what I'm looking for:
User requests: .../listing/property_type/retail/
Apache rewrites to: ../listing/?field=property_type&query=retail
Script sees: $_GET['field']='property_type' & $GET['query']='retail'
In the case of the boolean (all booleans will have only one Dir):
User requests: .../listing/forlease/
Apache rewrites to: ../listing/?forlease=1
Script sees: $_GET['forlease'] = 1
If your webserver is Apache, then you can use mod_rewrite.
Check out : http://www.yourhtmlsource.com/sitemanagement/urlrewriting.html =)
In your .htaccess you can have a couple of simple rules:
RewriteRule ^.*/listings/([a-zA-Z0-9_]+)/([a-zA-z0-9_]+)$ /listing/?property_type=$1&query=$2 [QSA,L]
RewriteRule ^.*/listings/forlease/$ /listing/?forlease=1 [QSA,L]
RewriteRule ^.*/listing/([^/]*)/?$ listing/?$1=1 [NC,L]
RewriteRule ^.*/listing/([^/]*)/?(.*)$ listing/?property_type=$1&query=$2 [NC,L]
Try this, first checks for a single condition (http://...listing/forlease), otherwise rewrites to (http://...listing/field/query)
You might want:
RewriteRule ^.*/listing/([^/]*)/?$ listing/?$1=1&%{QUERY_STRING} [NC,L]
RewriteRule ^.*/listing/([^/]*)/?(.*)$ listing/?property_type=$1&query=$2&%{QUERY_STRING} [NC,L]
To keep any additional parameters in the query string.

rewrite url and let more parameters

I am rewriting this kind of urls
http://deia.info/category/calendar/10/
To
/index.php?task=browse_posts&catid=$2
By this code in the .htaccess
RewriteRule ^category/(.+)/(.+) /index.php?task=browse_posts&catid=$2
Which seems to do the job. The problem is when additional parameters are sent, those are ignored.
For example:
http://deia.info/category/calendar/10/?start_date=10
isset($_GET['start_date']) won't return true
Why?
When the incoming URL holds a query like in the OP example:
http://deia.info/category/calendar/10/?start_date=10
The way to combine (Append) it with/to a new query in the substitution URL, is by adding the QSA Flag.
So add [L,QSA], like this:
RewriteRule ^category/(.+)/(.+) /index.php?task=browse_posts&catid=$2 [L,QSA]

Categories