Binnen mij CMS wil ik bijhouden welke (naar de server geuploade) plaatjes waar binnen de website gebruikt worden. Dit kan zijn op een pagina, in een .js of .css bestand. Hiervoor heb ik de volgende in .htaccess:
Deze regel herschrijft site.com/image/britney.png naar modules/image/image.php?q=britney.png. Het bestand image.php ziet er als volgt uit:
Als ik op de pagina site.com/zangeressen/britney de volgende HTML plaats, dan bevat $_SERVER['HTTP_REFERER'] de waarde "http://site.com/zangeressen/britney", dat werkt dus fijn:
Maar nu het probleem: dit werkt niet met geinclude css en js bestanden. Als ik bijvoorbeeld een css bestand aanmaak dat ik op site.com/zangeressen/britney aanroep, bevat de HTTP_REFERER ook http://site.com/zangeressen/britney in plaats van http://site.com/style.css:
Nu kan ik natuurlijk in de css een querystring aan het plaatje plakken en dit dan weer op image.php uitlezen:
Maar dat is niet gebruiksvriendelijk. Uiteindelijk moeten gebruikers gewoon image strings kunnen tikken en ik wil niet van hun verwachten dat ze achter elk plaatje een querystring met aanroepend bestand moeten tikken.
Mijn vraag is: hoe kan ik in deze situatie toch uitlezen dat britney.png vanuit style.css wordt aangeroepen? Ik heb alle $_SERVER variabelen geprobeerd, maar geen van ze bevat de info die ik nodig heb. Is er een andere $GLOBAL die ik kan gebruiken of moet er iets gebeuren met unobtrusive javascript? En zo ja, wat dan? En kan ik dan nog wel dat css bestand als losse file aanroepen? Vragen...vragen...
code:
1
| RewriteRule ^/?image\/(.+)$ modules/image/image.php?q=$1 [L,QSA] |
Deze regel herschrijft site.com/image/britney.png naar modules/image/image.php?q=britney.png. Het bestand image.php ziet er als volgt uit:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| $image = CMS_IMG_PATH . $_GET['q']; if (empty($image) || !file_exists($image)) { exit; } if (isset($_SERVER['HTTP_REFERER'])) { db_query("INSERT INTO {images_nodes} (referer, image) VALUES ('%s', '%s')", $_SERVER['HTTP_REFERER'], $_GET['q'] ); } $fp = fopen($image, 'rb'); header("Content-Type: " . mime_content_type($image)); header("Content-Length: " . filesize($image)); fpassthru($fp); exit; |
Als ik op de pagina site.com/zangeressen/britney de volgende HTML plaats, dan bevat $_SERVER['HTTP_REFERER'] de waarde "http://site.com/zangeressen/britney", dat werkt dus fijn:
HTML:
1
2
| Dit is Britney en zij is nu weer best lekker aan het worden: <img src="image/britney.png"> |
Maar nu het probleem: dit werkt niet met geinclude css en js bestanden. Als ik bijvoorbeeld een css bestand aanmaak dat ik op site.com/zangeressen/britney aanroep, bevat de HTTP_REFERER ook http://site.com/zangeressen/britney in plaats van http://site.com/style.css:
HTML:
1
2
3
4
5
6
7
8
9
10
| // site.com/style.css #britney { background: url(image/britney.png); } // site.com/zangeressen/britney <link rel="stylesheet" href="style.css" type="text/css"> <div id="britney"> Dit is Britney en zij is nu weer best lekker aan het worden </div> |
Nu kan ik natuurlijk in de css een querystring aan het plaatje plakken en dit dan weer op image.php uitlezen:
Cascading Stylesheet:
1
2
3
| #britney { background: url(image/britney.png?file=style.css); } |
Maar dat is niet gebruiksvriendelijk. Uiteindelijk moeten gebruikers gewoon image strings kunnen tikken en ik wil niet van hun verwachten dat ze achter elk plaatje een querystring met aanroepend bestand moeten tikken.
Mijn vraag is: hoe kan ik in deze situatie toch uitlezen dat britney.png vanuit style.css wordt aangeroepen? Ik heb alle $_SERVER variabelen geprobeerd, maar geen van ze bevat de info die ik nodig heb. Is er een andere $GLOBAL die ik kan gebruiken of moet er iets gebeuren met unobtrusive javascript? En zo ja, wat dan? En kan ik dan nog wel dat css bestand als losse file aanroepen? Vragen...vragen...
"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."