[TYPO3] mod_rewrite - Mass Redirection Help Needed (I'm Desparate!)

Timothy Patterson tjpatter at svsu.edu
Wed May 23 22:31:29 CEST 2007


Oliver,

I've seen this page/technique before, but from the looks of things I 
cannot send http://www.domain.com/its/index.cfm?doc_id=10 and 
http://www.domain.com/its/index.cfm?doc_id=20 to different pages due to 
matching only taking place at the file level...  Is this in fact the case?

Thanks,
Tim

Oliver Rowlands wrote:
> Hi Timothy,
> 
> It seems you didn't look hard enough. I suggest you have a look at 
> Apache's mod_rewrite rewrite maps[1]. I've used them in the past to 
> migrate sites with 1000's of pages to Typo3.
> 
> Let me know if you want more information on how to set this up.
> 
> Regards,
> 
> Oliver
> 
> [1] http://httpd.apache.org/docs/1.3/mod/mod_rewrite.html#RewriteMap
> 
> Timothy Patterson wrote:
>> We are moving away from a CMS that utilizes URLs in the form of 
>> "http://www.domain.com/its/index.cfm?doc_id=10" in favor of Typo3.
>>
>> I have RealURL working perfectly (great job devs!) and I am quite 
>> satisfied with my setup.
>>
>> My problem is the fact that I have to keep all of the old URLs valid 
>> on my site.  Due to the 1000s of pages on my site I would like to 
>> implement a type of redirection database to keep the old URLs valid 
>> while increasing manageability of the redirections.
>>
>> After doing some research online, I have found that there is no 
>> clean-cut way to redirect a URL in the style that our old CMS uses.
>>
>> Example:
>> You can only redirect "http://www.domain.com/its/index.cfm" to any 
>> URL.  You cannot redirect 
>> "http://www.domain.com/its/index.cfm?doc_id=10" to a URL and 
>> "http://www.domain.com/its/index.cfm?doc_id=20" to a different URL.  
>> Catch my drift?  "Standard" redirects only allow you to match file 
>> names and not the parameters after the file name.
>>
>> My solution was to create a MySQL database, then use a combination of 
>> mod_rewrite with PHP.
>>
>> If you view my sample .htaccess file and PHP script below, you can see 
>> my problem...  My setup works great except for the fact that I get a 
>> ?myredirect=0 appended to every single URL on my site.  I've played 
>> with mod_rewrite for hours to try to get rid of that, but it seems to 
>> be the only way to avoid an infinite rewriting loop (it is the only 
>> way I can communicate from the PHP script back to mod_rewrite).  I 
>> really don't want the ?myredirect=0 on every page.
>>
>> Does anyone have any suggestions?  Any better ways of accomplishing 
>> this goal?  Does anyone know of any other mass redirection solutions?  
>> Any other hybrid PHP / mod_rewrite possibilities?  Am I just crazy?
>>
>> If I can get some help I'd be glad to write up a How-to doc that will 
>> help others migrating away from a different CMS.
>>
>> Here is what I have so far...  (It works, just adds a ?myredirect=0 to 
>> every page's url.  Grr!)
>>
>> mod_rewrite (in a .htaccess file):
>> RewriteEngine On
>> RewriteCond %{QUERY_STRING} !(myredirect)
>> RewriteRule .* /redirect.php?dbredirection=%{REQUEST_URI} [L,QSA]
>>
>> And my PHP code:
>> <?php
>> // DB Connectivity Include...
>> include "config.php";
>>
>> // Reads QUERY_STRING environment variable and grabs everything 'after 
>> // dbredirection='
>> list($junk, $request) = split("dbredirection=", getenv('QUERY_STRING'));
>>
>> // Replace the first instance of a & with a ? (caused by mod_rewrite)
>> $request = preg_replace("/(\&)/", "?", $request, 1);
>>
>> // Connect to MySQL...
>> $connection = mysql_connect($db_host, $db_user, $db_pass);
>> mysql_select_db($db);
>>
>> // Get today's date in MySQL format...
>> $expdate = date('Y-m-d');
>>
>> // Build Query...
>> // Select & Check Expiration - Default is 2050-01-01 so we should be 
>> ok // with this...
>> $query = "SELECT newurl FROM redirects WHERE oldurl='$request' AND 
>> expires >= '$expdate' LIMIT 1";
>>
>> // Execute Query...
>> $result = mysql_query($query);
>>     if(mysql_num_rows($result) != 0)
>> {
>>     // Retrieve Row...
>>     $row = mysql_fetch_row($result);
>>
>>     //echo "Redirecting to: $row[0]";
>>     //die;
>>
>>     // Perform Safe, "Permanent" Redirect...
>>     header("HTTP/1.1 301 Moved Permanently");
>>     header("Location: $row[0]");
>>     die;
>> } else {
>>     // No entries exist...  Try to go to page...
>>     // Add ?myredirect=0 to the URL to prevent mod_rewrite loops!!!
>>
>>     // Does $request contain a '?'
>>     $qmark = strstr($request, '?');
>>     if(!$qmark)
>>     {
>>         $request .= "?myredirect=0";
>>     } else {
>>         $request .= "&myredirect=0";
>>     }
>>            header("Location: $request");
>>     die;
>> }
>> ?>
> 
> 


More information about the TYPO3-english mailing list