Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why is PHP discriminating between .php and .abc extensions for caching?

There seems to be a problem between how PHP engine handles identical files that differ only in their file extension.

Problem: "An If-Modified-Since conditional request returned the full content unchanged."

Also, I measured that the .php extension loads much faster than identitcal twin with .xxx extension even though the file contents are identical, and they differ only in their file extension.

alt text

alt text

"HTTP allows clients to make conditional requests to see if a copy that they hold is still valid. Since this response has a Last-Modified header, clients should be able to use an If-Modified-Since request header for validation. RED has done this and found that the resource sends a full response even though it hadn't changed, indicating that it doesn't support Last-Modified validation."


homepage ending with .php

alt text


exact same file, but ending .ast

alt text


Given:

A home.php file is copied as home.xxx and this extension is added to htaccess to recognize it as a PHP file. The .php file listen to the php.ini where freshness is set to 3 hrs, the non .php files have to listen to htaccess where freshness is set to 2 hrs according to:

AddType application/x-httpd-php .php .ast .abc .xxx .etc

<IfModule mod_headers.c>
    ExpiresActive On
    ExpiresDefault M2419200
    Header unset ETag
    FileETag None
    Header unset Pragma
    Header set Cache-Control "max-age=2419200"

    ##### DYNAMIC PAGES
    <FilesMatch "\\.(ast|php|abc|xxx)$">
        ExpiresDefault M7200
        Header set Cache-Control "public, max-age=7200"
    </FilesMatch>
</IfModule>

So far so good and everything loads, except, the non-php file doesn't cache properly, or it does cache well but doesn't validate well, to be more specific. See images enclosed. Only the non-php file extension causes the error and loads slower.

The entire page.php loads faster as somehow all the elements in there then load properly from cache, while the page.abc has the full request returned while it ought to be cached, meaning the entire page is slower.

Bottom line: What should be changed, in order eliminate the If-Modified-Since conditional request returning the full content unchanged?

like image 272
Sam Avatar asked Dec 21 '10 19:12

Sam


1 Answers

It seems like your server is having trouble determining how to decode the extension, since it is not .php. Even if you defined the extension to be recognized as php in your httpacess, it still requires some extra steps for the server to process the page, meaning it will always take longer then just using .php (although it should only be a few ms difference, most likely a server problem is causing this to take much longer). Why not just use the .php extension on your pages? Why do you need .abc? It's always best to just use the default extension instead of masking it.

EDIT: Put this function on the top of each page, it will detect what domain name the user is on, strip the www and domain extension and then display content for that specific domain name only. You can use the same .php file for every domain name and don't have to do any funky extensions.

<?php
$domain = explode(".", $_SERVER['SERVER_NAME']);
if ($domain[2]) {
    $domainName = $domain[1];
}
else {
    $domainName = $domain[0];
}

if ($domainName = "YourDomainNameWithNoExtension") {
    echo "Welcome to $domainName";
}
?>
like image 64
Kyle Avatar answered Oct 23 '22 10:10

Kyle