htaccess - internal redirects problem - cpu load

PHP programming forum. Ask questions or help people concerning PHP code. Don't understand a function? Need help implementing a class? Don't understand a class? Here is where to ask. Remember to do your homework!

Moderator: General Moderators

Post Reply
markjohnson
Forum Newbie
Posts: 15
Joined: Sat Feb 07, 2009 8:36 pm

htaccess - internal redirects problem - cpu load

Post by markjohnson »

Hi,

Code: Select all

php_flag magic_quotes_gpc off
Options +FollowSymlinks
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME}   !-s
RewriteRule ^admin(.*)$ admin/index.php [L]
RewriteCond %{REQUEST_FILENAME}   !-s
RewriteCond %{REQUEST_FILENAME}   !-d
RewriteRule .* index.php [L,QSA]
The idea is to fetch the entire URL into index.php, e.g. http://site.com/page1/page2/3928

index.php would then explode the uri 'page1/page2/3928' into three parts

page1/page2 list all the products (i.e. if $uri[2] is not set, then list all products). This works fine.

page1/page2/3928 is supposed to present product detail, which it does, but for some reason it also runs the query for product listing (page1/page2) not only once but several times.

When I click on page1/page2/3928, mysqyl shows me several instances of product listing query which shouldn't be running at all.

My guess is that /page1/page2/3928 is also internally redirecting about 10 times to /page1 as well.

The rewrite log file show many instances of the following:

Code: Select all

127.0.0.1 - - [25/Jan/2010:02:44:58 +0000] [site/sid#1656600][rid#28e14c8/initial] (2) [perdir C:/xampp/htdocs/site/public_html/] trying to replace prefix C:/xampp/htdocs/site/public_html/ with /
127.0.0.1 - - [25/Jan/2010:02:44:58 +0000] [site/sid#1656600][rid#28e14c8/initial] (1) [perdir C:/xampp/htdocs/site/public_html/] internal redirect with /index.php [INTERNAL REDIRECT]
127.0.0.1 - - [25/Jan/2010:02:44:58 +0000] [site/sid#1656600][rid#2c53088/initial/redir#1] (3) [perdir C:/xampp/htdocs/site/public_html/] strip per-dir prefix: C:/xampp/htdocs/site/public_html/index.php -> index.php
127.0.0.1 - - [25/Jan/2010:02:44:58 +0000] [site/sid#1656600][rid#2c53088/initial/redir#1] (3) [perdir C:/xampp/htdocs/site/public_html/] applying pattern '(.*)' to uri 'index.php'
127.0.0.1 - - [25/Jan/2010:02:44:58 +0000] [site/sid#1656600][rid#2c53088/initial/redir#1] (3) [perdir C:/xampp/htdocs/site/public_html/] strip per-dir prefix: C:/xampp/htdocs/site/public_html/index.php -> index.php
127.0.0.1 - - [25/Jan/2010:02:44:58 +0000] [site/sid#1656600][rid#2c53088/initial/redir#1] (3) [perdir C:/xampp/htdocs/site/public_html/] applying pattern '^(.+)$' to uri 'index.php'
127.0.0.1 - - [25/Jan/2010:02:44:58 +0000] [site/sid#1656600][rid#2c53088/initial/redir#1] (1) [perdir C:/xampp/htdocs/site/public_html/] pass through C:/xampp/htdocs/site/public_html/index.php
Any help will be appreciated.

Many thanks!
markjohnson
Forum Newbie
Posts: 15
Joined: Sat Feb 07, 2009 8:36 pm

Re: htaccess - internal redirects problem - cpu load

Post by markjohnson »

*bump*

For further clarification, here are the two queries, only one of which should run:

// This function looks at the uri "/whatever-product-name-id-2039" and extracts the id at the end: 2039
product_id($uri[1]);

// Run only if end of uri is a number
if (product_id($uri[1])) {

//this runs fine, which it should.
$qryDisplayProduct = "SELECT * FROM content WHERE id = ".content_id($path[1]);

} else {
//for some reason, mysql shows several processes for this query which should NOT run. Not only it runs but several instances clogging up the CPU.
$qryListProducts = "SELECT * FROM content ORDER BY `date` DESC";
}

In light of the above from ReWriteLog, am I right in at least assuming that this is due to internal redirects?

What am I doing wrong?
markjohnson
Forum Newbie
Posts: 15
Joined: Sat Feb 07, 2009 8:36 pm

Re: htaccess - internal redirects problem - cpu load

Post by markjohnson »

For further info on the problem:

This is what index.php does right in the beginning:

Code: Select all

$uri = preg_replace("/\/+/", "/", substr($_SERVER["REQUEST_URI"], strlen($cms_path)));
if(substr($uri, 0, 1) == "/") $uri = substr($uri, 1);
if(strpos($uri, "?"))
$uri = substr($uri, 0, strpos($uri, "?"));
if ($uri=="") $uri="/";
 
$path=explode("/",$uri);
 
It just takes a url like site.com/categoryA/categoryB/product-name-id-1234 and breaks it down like:

$path[0]=categoryA
$path[1]=categoryB
$path[2]=product-name-id-1234

OR, sometimes:

site.com/categoryA/product-name-id-5678

which is broken down as:

$path[0]=categoryA
$path[1]=product-name-id-5678

The php script then checks $path[1] for a pattern like this: 'id-1234' If it finds it, it runs the query for displaying product details.

If the pattern doesn't match, it simply lists all the products in categoryA.

The problem that I am encountering now is that when it is given this URL:

site.com/categoryA/product-name-id-5678

It is showing the product details page, which is fine, but it is also running Product list query several times, raising CPU usage to 100%.

I think it is quite obvious, looking at the ReWriteLog that it is due to internal redirects to index.php

And if I am right, I need to know how to stop internal redirection.

Thanks
Post Reply