Helmet Posted February 15, 2009 Share Posted February 15, 2009 Hi, I've been looking at how I can redirect a bunch of variable directories but I'm only finding examples where the directories being redirected are hard-coded. What I want to do is 301 redirect a whole bunch of these: 1) http://example.com/foo/file.php?id=bar To this 2) http://example.com/foo/file/bar/ 1 is my current real directory structure, which I'm already successfully mod_rewrite'ing to 2, which hits my new, simplified file structure: 3) http://example.com/file.php?var=foo&id=bar RewriteRule (.*)/file/(.*)/ file.php?var=$1&id=$2 This allows me to not have to maintain a ton of virtually identical directories. I'm just looking for a way to redirect any traffic I get to the old structure (1), where I don't know which directory "foo" might be, to it's corresponding path 2. ...reading this post I suspect I may have explained it really unclearly Link to comment https://forums.phpfreaks.com/topic/145315-solved-reducing-approx-30-directories-to-1-file/ Share on other sites More sharing options...
corbin Posted February 15, 2009 Share Posted February 15, 2009 Wait.... I'm confused. You want to rewrite 1 to 2? Or you want to rewrite 2 to three? Link to comment https://forums.phpfreaks.com/topic/145315-solved-reducing-approx-30-directories-to-1-file/#findComment-762889 Share on other sites More sharing options...
Helmet Posted February 15, 2009 Author Share Posted February 15, 2009 Basically if I get traffic to the old structure: http://example.com/foo/file.php?id=bar I want to 301 redirect it using htaccess to http://example.com/foo/file/bar/ ...heh I just realized that I might be in the wrong forum. I posted here because this is going to work in concert with my rewrite: RewriteRule (.*)/file/(.*)/ file.php?var=$1&id=$2 Which allows me to emulate my old directory structure with one file. Link to comment https://forums.phpfreaks.com/topic/145315-solved-reducing-approx-30-directories-to-1-file/#findComment-762897 Share on other sites More sharing options...
corbin Posted February 15, 2009 Share Posted February 15, 2009 RewriteRule ^([^/]+)/(.*?).php\?id=([^&]+) /$1/$2/$3/ [L] Is all I can think of, and you will want to put it before the other rewrite (or it will make a loop). Link to comment https://forums.phpfreaks.com/topic/145315-solved-reducing-approx-30-directories-to-1-file/#findComment-762903 Share on other sites More sharing options...
Helmet Posted February 15, 2009 Author Share Posted February 15, 2009 Thanks very much for your help on this, Corbin... I tried that rule, but it looks like you have it where the name of the php file is variable, but that's not the case. I get a 404 when i try the rule you suggested and hit /foo/file.php?id=bar The only file that exists is /file.php , but that doesn't change names. I used to have a ton of directories each with a file.php within it: /foo/file.php Now I want a) a string like /file.php?directory=foo&id=bar to look like /foo/file/bar/ and b) make sure that any requests for /foo/file.php?id=bar is redirected to the new fake /foo/file/bar/ Can this be done with rewrite alone? i was assuming I had to do a rewrite for a, and a redirect for b. Link to comment https://forums.phpfreaks.com/topic/145315-solved-reducing-approx-30-directories-to-1-file/#findComment-762913 Share on other sites More sharing options...
corbin Posted February 16, 2009 Share Posted February 16, 2009 Oh, sorry it can't be done with a rewrite, but the rewrite can turn into a redirect. Don't know why I didn't put that in there earlier. Try: RewriteRule ^([^/]+)/file\.php\?id=([^&]+) /$1/$2/$3/ [L,R=301] Link to comment https://forums.phpfreaks.com/topic/145315-solved-reducing-approx-30-directories-to-1-file/#findComment-763088 Share on other sites More sharing options...
Helmet Posted February 16, 2009 Author Share Posted February 16, 2009 Well, that was still getting me a 404, but it pointed me in the right direction... I did a little more research and now I'm so close I can taste it except that this is redirecting to /directory/file/3451/?id=3451 what I want is just /directory/file/3451/ If I can just get rid of the querystring, I'm set! RewriteCond %{QUERY_STRING} ^id=([0-9]*)$ RewriteRule ^([^/]+)/file\.php$ http://example.com/$1/file/%1/ [R=302,L] Link to comment https://forums.phpfreaks.com/topic/145315-solved-reducing-approx-30-directories-to-1-file/#findComment-763161 Share on other sites More sharing options...
Helmet Posted February 16, 2009 Author Share Posted February 16, 2009 Figured it out, just needed a question mark at the end of the redirect url to nuke the query string. RewriteCond %{QUERY_STRING} ^id=([0-9]*)$ RewriteRule ^([^/]+)/file\.php$ http://example.com/$1/file/%1/? [R=302,L] Thanks for you help! Link to comment https://forums.phpfreaks.com/topic/145315-solved-reducing-approx-30-directories-to-1-file/#findComment-763168 Share on other sites More sharing options...
corbin Posted February 16, 2009 Share Posted February 16, 2009 You figured it out but no problem ;p. Link to comment https://forums.phpfreaks.com/topic/145315-solved-reducing-approx-30-directories-to-1-file/#findComment-763171 Share on other sites More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.