Why would I do that?

Web designers and developers are often faced with the problem that they want to change something on an existing website or application, and it is not possible to directly modify the source code or resources on the server.
This tutorial shows how to set up a local proxy server running on the local workstation.
Through this proxy then we will browse to the target page.
A part of the HTTP traffic will redirect to your own computer where you have write access.
For example, we want to load all css resources from our own computer.
Without having a running copy of the application code on your machine, you are still not able to change to the server-side application logic like database access, session behavior, ...
But this method is very good for experiments with the appearance or the javascript code of the target page.
If the target application is running in an IDE on the local machine, you can also use the proxy the opposite way to try how your version of the application on the real website would look and behave.



Overview

This diagram shows how it works.
The proxy serves the css and js files from the local disk, the rest comes from the target server.



Preparare your workstation

Download and extract XAMPP

For this tutorial you will need to download a copy of the XAMPP suite for your system.
Download the ZIP file:


Note: Apache requires to run in a path containing no blanks. Otherwise it will not start.
I chose to extract it to c:\xampp



Alter the local server port (optional if you are not admin)

If you are not a local administrator on your computer, you need to alter the port of your local Apache webserver to a value larger than 1024.
Set the property "Listen" in httpd.conf to your preferred value:
In this example I will change the it to 1030. (Default is 80)



Verify the apache installation

Now you can perform a little test, start apache and browse to its start page.

  1. Start the server by running xampp-control.exe, ...

  2. ... and click start on the apache module:

  3. Browse to http://localhost:1030 and check if you see something like a splash page.


Setup a simple proxy

OK, we have a local webserver. Let's set up the proxy!



Enable Apache modules

First, we need to make sure that the following apache modules are enabled.
Open httpd.conf and make sure that the following lines are not commented: (remove '#' at the beginning of the line)





Configure simple test proxy

Let's check our apaches proxy module.
Open the http-proxy.conf and set an example rule set like below.

Save the config files and restart the apache module by stopping and starting again:

Open your browser and see if it routes you to the given target page:
Note the different url /example

Good, our proxy also works fine.



Complete example step by step

Overview for this example

In this example our goals are:

  • View the website http://orf.at in our local browser through our local proxy.
  • All html content (except the css files we plan to modify) are loaded from the target webserver.
  • We will download a copy of the css files from the target server to our disk where we are able to edit them.
  • See the results in all browsers available on the computer. No browser modifications are needed.

Configure the target page

Back to the httpd-proxy.conf, remove the ProxyPass line and insert a new rule.
Note the different directive ProxyPassMatch
The first argument ^(/.*)$ says: Everything that starts with a slash
is routed forward. The second argument is the target page's url.
In the screenshot you will find the complete content of httpd-proxy.conf.

After each config modification, apache needs a restart.
For the rest of this how-to, I will imply this.



Check which resources you want to modify

Now browse to your proxy url, and see where the css files are loaded from.
In our example this is simple, there are only 2 such files in use by the target page.



Exclude the css resources in the proxy definition

In this example, I will bypass the css files to our local disk.
An additional rule is needed in the proxy configuration.
Insert it before the existing rule. Apache will handle the rules in their defined order.

If you refresh the page in your browser, you should see that the css files are not loaded.
Your local Apache server tries to find the files inside its webroot folder and does not find them.
Ouch - 404 - but OK, the proxy does not fetch the css any more:



Download the css resources to your disk

Since the css HTTP requests are not served by the proxy any more, apache will try to load the resources from the local filesystem.
More precisely, apache loads relatively to the htdocs folder in the XAMPP installation directory.
According to the css urls that can be seen in the firebug panel, simply create the subfolders, and download the css files into the created location:

Now verify that apache serves the local css files. The page should look normal again after a refresh:



The funny part - Hack!

Finally, we're able to change the css files, and see the results immediately in our web browser
For example, use pink as background color:

And, with a single browser refresh you can see the change.
Note: if you modify the resources in the htdocs folder, you do not need a server restart. Only when changing the apache config.

3.22MBMemory Usage53.7msRequest Duration
Joomla! Version5.2.5
PHP Version8.3.8
Identityguest
Response200
Templatecassiopeia
Database
Server
mysql
Version
10.11.11-MariaDB-0+deb12u1
Collation
utf8mb4_general_ci
Conn Collation
utf8mb4_general_ci
$_GET
[]
$_POST
[]
$_SESSION
array:1 [ "joomla" => "***redacted***" ]
$_COOKIE
[]
$_SERVER
array:42 [ "HTTPS" => "on" "SSL_TLS_SNI" => "bytesare.us" "HTTP_HOST" => "bytesare.us" "HTTP...
session
array:3 [ "counter" => 1 "timer" => array:3 [ "start" => 1743634028 "last" => 1743634028...
registry
array:3 [ "data" => [] "initialized" => false "separator" => "." ]
user
array:21 [ "id" => 0 "name" => null "username" => null "email" => null "password" => "***r...
  • afterLoad (84.88KB) (1.3ms)
  • afterInitialise (1.09MB) (12.09ms)
  • afterRoute (85.64KB) (1.71ms)
  • beforeRenderComponent com_content (72.1KB) (2.24ms)
  • Before Access::preloadComponents (all components) (104.59KB) (1.1ms)
  • After Access::preloadComponents (all components) (119.43KB) (1.09ms)
  • Before Access::preloadPermissions (com_content) (1.63KB) (21μs)
  • After Access::preloadPermissions (com_content) (3.24KB) (817μs)
  • Before Access::getAssetRules (id:230 name:com_content.article.29) (104B) (22μs)
  • After Access::getAssetRules (id:230 name:com_content.article.29) (7.38KB) (116μs)
  • afterRenderComponent com_content (393.24KB) (14.47ms)
  • afterDispatch (2.28KB) (120μs)
  • beforeRenderRawModule mod_menu (Main Menu) (351.02KB) (4.29ms)
  • afterRenderRawModule mod_menu (Main Menu) (285.89KB) (4.15ms)
  • beforeRenderRawModule mod_breadcrumbs (Breadcrumbs) (7.9KB) (319μs)
  • afterRenderRawModule mod_breadcrumbs (Breadcrumbs) (9.05KB) (611μs)
  • beforeRenderModule mod_breadcrumbs (Breadcrumbs) (704B) (8μs)
  • afterRenderModule mod_breadcrumbs (Breadcrumbs) (4.67KB) (174μs)
  • beforeRenderModule mod_menu (Main Menu) (1.15KB) (55μs)
  • afterRenderModule mod_menu (Main Menu) (10.42KB) (45μs)
  • afterRender (253.55KB) (8.41ms)
  • 1 x afterRenderComponent com_content (393.24KB) (26.95%)
    14.47ms
    1 x afterInitialise (1.09MB) (22.5%)
    12.09ms
    1 x afterRender (253.55KB) (15.66%)
    8.41ms
    1 x beforeRenderRawModule mod_menu (Main Menu) (351.02KB) (7.98%)
    4.29ms
    1 x afterRenderRawModule mod_menu (Main Menu) (285.89KB) (7.73%)
    4.15ms
    1 x beforeRenderComponent com_content (72.1KB) (4.17%)
    2.24ms
    1 x afterRoute (85.64KB) (3.19%)
    1.71ms
    1 x afterLoad (84.88KB) (2.41%)
    1.30ms
    1 x Before Access::preloadComponents (all components) (104.59KB) (2.06%)
    1.10ms
    1 x After Access::preloadComponents (all components) (119.43KB) (2.03%)
    1.09ms
    1 x After Access::preloadPermissions (com_content) (3.24KB) (1.52%)
    817μs
    1 x afterRenderRawModule mod_breadcrumbs (Breadcrumbs) (9.05KB) (1.14%)
    611μs
    1 x beforeRenderRawModule mod_breadcrumbs (Breadcrumbs) (7.9KB) (0.59%)
    319μs
    1 x afterRenderModule mod_breadcrumbs (Breadcrumbs) (4.67KB) (0.32%)
    174μs
    1 x afterDispatch (2.28KB) (0.22%)
    120μs
    1 x After Access::getAssetRules (id:230 name:com_content.article.29) (7.38KB) (0.22%)
    116μs
    1 x beforeRenderModule mod_menu (Main Menu) (1.15KB) (0.1%)
    55μs
    1 x afterRenderModule mod_menu (Main Menu) (10.42KB) (0.08%)
    45μs
    1 x Before Access::getAssetRules (id:230 name:com_content.article.29) (104B) (0.04%)
    22μs
    1 x Before Access::preloadPermissions (com_content) (1.63KB) (0.04%)
    21μs
    1 x beforeRenderModule mod_breadcrumbs (Breadcrumbs) (704B) (0.02%)
    8μs
28 statements were executed, 5 of which were duplicates, 23 unique10.06ms161.65KB
  • SELECT @@SESSION.sql_mode;102μs968B/libraries/vendor/joomla/database/src/Mysqli/MysqliDriver.php:308Copy
  • SELECT `data` FROM `cms_session` WHERE `session_id` = ?136μs1008BParams/libraries/vendor/joomla/session/src/Handler/DatabaseHandler.php:250Copy
  • SELECT `session_id` FROM `cms_session` WHERE `session_id` = :session_id LIMIT 180μs1.3KBParams/libraries/src/Session/MetadataManager.php:187Copy
  • INSERT INTO `cms_session` (`session_id`,`guest`,`time`,`userid`,`username`,`client_id`) VALUES (:session_id, :guest, :time, :user_id, :username, :client_id)536μs944BParams/libraries/src/Session/MetadataManager.php:260Copy
  • SELECT `extension_id` AS `id`,`element` AS `option`,`params`,`enabled` FROM `cms_extensions` WHERE `type` = 'component' AND `state` = 0 AND `enabled` = 1278μs1.61KB/libraries/src/Component/ComponentHelper.php:399Copy
  • SELECT `id`,`rules` FROM `cms_viewlevels`86μs624B/libraries/src/Access/Access.php:955Copy
  • SELECT `b`.`id` FROM `cms_usergroups` AS `a` LEFT JOIN `cms_usergroups` AS `b` ON `b`.`lft` <= `a`.`lft` AND `b`.`rgt` >= `a`.`rgt` WHERE `a`.`id` = :guest125μs1.31KBParams/libraries/src/Access/Access.php:868Copy
  • SELECT `folder` AS `type`,`element` AS `name`,`params` AS `params`,`extension_id` AS `id` FROM `cms_extensions` WHERE `enabled` = 1 AND `type` = 'plugin' AND `state` IN (0,1) AND `access` IN (:preparedArray1) ORDER BY `ordering`829μs3.96KBParams/libraries/src/Plugin/PluginHelper.php:294Copy
  • SELECT `m`.`id`,`m`.`menutype`,`m`.`title`,`m`.`alias`,`m`.`note`,`m`.`link`,`m`.`type`,`m`.`level`,`m`.`language`,`m`.`browserNav`,`m`.`access`,`m`.`params`,`m`.`home`,`m`.`img`,`m`.`template_style_id`,`m`.`component_id`,`m`.`parent_id`,`m`.`path` AS `route`,`e`.`element` AS `component` FROM `cms_menu` AS `m` LEFT JOIN `cms_extensions` AS `e` ON `m`.`component_id` = `e`.`extension_id` WHERE ( (`m`.`published` = 1 AND `m`.`parent_id` > 0 AND `m`.`client_id` = 0) AND (`m`.`publish_up` IS NULL OR `m`.`publish_up` <= :currentDate1)) AND (`m`.`publish_down` IS NULL OR `m`.`publish_down` >= :currentDate2) ORDER BY `m`.`lft`526μs36.55KBParams/libraries/src/Menu/SiteMenu.php:166Copy
  • SELECT * FROM `cms_languages` WHERE `published` = 1 ORDER BY `ordering` ASC164μs1.59KB/libraries/src/Language/LanguageHelper.php:177Copy
  • SELECT `id`,`home`,`template`,`s`.`params`,`inheritable`,`parent` FROM `cms_template_styles` AS `s` LEFT JOIN `cms_extensions` AS `e` ON `e`.`element` = `s`.`template` AND `e`.`type` = 'template' AND `e`.`client_id` = `s`.`client_id` WHERE `s`.`client_id` = 0 AND `e`.`enabled` = 1205μs832B/administrator/components/com_templates/src/Model/StyleModel.php:775Copy
  • SELECT `id`,`name`,`rules`,`parent_id` FROM `cms_assets` WHERE `name` IN (:preparedArray1,:preparedArray2,:preparedArray3,:preparedArray4,:preparedArray5,:preparedArray6,:preparedArray7,:preparedArray8,:preparedArray9,:preparedArray10,:preparedArray11,:preparedArray12,:preparedArray13,:preparedArray14,:preparedArray15,:preparedArray16,:preparedArray17,:preparedArray18,:preparedArray19,:preparedArray20,:preparedArray21,:preparedArray22,:preparedArray23,:preparedArray24,:preparedArray25,:preparedArray26,:preparedArray27,:preparedArray28,:preparedArray29,:preparedArray30,:preparedArray31,:preparedArray32,:preparedArray33,:preparedArray34,:preparedArray35,:preparedArray36,:preparedArray37,:preparedArray38,:preparedArray39,:preparedArray40,:preparedArray41)591μs7.44KBParams/libraries/src/Access/Access.php:357Copy
  • SELECT `id`,`name`,`rules`,`parent_id` FROM `cms_assets` WHERE `name` LIKE :asset OR `name` = :extension OR `parent_id` = 0549μs2.23KBParams/libraries/src/Access/Access.php:301Copy
  • SHOW FULL COLUMNS FROM `cms_content`477μs1.77KB/libraries/vendor/joomla/database/src/Mysqli/MysqliDriver.php:587Copy
  • UPDATE `cms_content` SET `hits` = (`hits` + 1) WHERE `id` = '29'490μs48B/libraries/src/Table/Table.php:1348Copy
  • SELECT `a`.`id`,`a`.`asset_id`,`a`.`title`,`a`.`alias`,`a`.`introtext`,`a`.`fulltext`,`a`.`state`,`a`.`catid`,`a`.`created`,`a`.`created_by`,`a`.`created_by_alias`,`a`.`modified`,`a`.`modified_by`,`a`.`checked_out`,`a`.`checked_out_time`,`a`.`publish_up`,`a`.`publish_down`,`a`.`images`,`a`.`urls`,`a`.`attribs`,`a`.`version`,`a`.`ordering`,`a`.`metakey`,`a`.`metadesc`,`a`.`access`,`a`.`hits`,`a`.`metadata`,`a`.`featured`,`a`.`language`,`fp`.`featured_up`,`fp`.`featured_down`,`c`.`title` AS `category_title`,`c`.`alias` AS `category_alias`,`c`.`access` AS `category_access`,`c`.`language` AS `category_language`,`fp`.`ordering`,`u`.`name` AS `author`,`parent`.`title` AS `parent_title`,`parent`.`id` AS `parent_id`,`parent`.`path` AS `parent_route`,`parent`.`alias` AS `parent_alias`,`parent`.`language` AS `parent_language`,ROUND(`v`.`rating_sum` / `v`.`rating_count`, 1) AS `rating`,`v`.`rating_count` AS `rating_count` FROM `cms_content` AS `a` INNER JOIN `cms_categories` AS `c` ON `c`.`id` = `a`.`catid` LEFT JOIN `cms_content_frontpage` AS `fp` ON `fp`.`content_id` = `a`.`id` LEFT JOIN `cms_users` AS `u` ON `u`.`id` = `a`.`created_by` LEFT JOIN `cms_categories` AS `parent` ON `parent`.`id` = `c`.`parent_id` LEFT JOIN `cms_content_rating` AS `v` ON `a`.`id` = `v`.`content_id` WHERE ( (`a`.`id` = :pk AND `c`.`published` > 0) AND (`a`.`publish_up` IS NULL OR `a`.`publish_up` <= :publishUp)) AND (`a`.`publish_down` IS NULL OR `a`.`publish_down` >= :publishDown) AND `a`.`state` IN (:preparedArray1,:preparedArray2)435μs22.13KBParams/components/com_content/src/Model/ArticleModel.php:215Copy
  • SELECT `c`.`id`,`c`.`asset_id`,`c`.`access`,`c`.`alias`,`c`.`checked_out`,`c`.`checked_out_time`,`c`.`created_time`,`c`.`created_user_id`,`c`.`description`,`c`.`extension`,`c`.`hits`,`c`.`language`,`c`.`level`,`c`.`lft`,`c`.`metadata`,`c`.`metadesc`,`c`.`metakey`,`c`.`modified_time`,`c`.`note`,`c`.`params`,`c`.`parent_id`,`c`.`path`,`c`.`published`,`c`.`rgt`,`c`.`title`,`c`.`modified_user_id`,`c`.`version`, CASE WHEN CHAR_LENGTH(`c`.`alias`) != 0 THEN CONCAT_WS(':', `c`.`id`, `c`.`alias`) ELSE `c`.`id` END as `slug` FROM `cms_categories` AS `s` INNER JOIN `cms_categories` AS `c` ON (`s`.`lft` <= `c`.`lft` AND `c`.`lft` < `s`.`rgt`) OR (`c`.`lft` < `s`.`lft` AND `s`.`rgt` < `c`.`rgt`) WHERE (`c`.`extension` = :extension OR `c`.`extension` = 'system') AND `c`.`access` IN (:preparedArray1) AND `c`.`published` = 1 AND `s`.`id` = :id ORDER BY `c`.`lft`351μs5.16KBParams/libraries/src/Categories/Categories.php:375Copy
  • SELECT `m`.`tag_id`,`t`.* FROM `cms_contentitem_tag_map` AS `m` INNER JOIN `cms_tags` AS `t` ON `m`.`tag_id` = `t`.`id` WHERE `m`.`type_alias` = :contentType AND `m`.`content_item_id` = :id AND `t`.`published` = 1 AND `t`.`access` IN (:preparedArray1)291μs11.95KBParams/libraries/src/Helper/TagsHelper.php:388Copy
  • SELECT `c`.`id`,`c`.`asset_id`,`c`.`access`,`c`.`alias`,`c`.`checked_out`,`c`.`checked_out_time`,`c`.`created_time`,`c`.`created_user_id`,`c`.`description`,`c`.`extension`,`c`.`hits`,`c`.`language`,`c`.`level`,`c`.`lft`,`c`.`metadata`,`c`.`metadesc`,`c`.`metakey`,`c`.`modified_time`,`c`.`note`,`c`.`params`,`c`.`parent_id`,`c`.`path`,`c`.`published`,`c`.`rgt`,`c`.`title`,`c`.`modified_user_id`,`c`.`version`, CASE WHEN CHAR_LENGTH(`c`.`alias`) != 0 THEN CONCAT_WS(':', `c`.`id`, `c`.`alias`) ELSE `c`.`id` END as `slug` FROM `cms_categories` AS `s` INNER JOIN `cms_categories` AS `c` ON (`s`.`lft` <= `c`.`lft` AND `c`.`lft` < `s`.`rgt`) OR (`c`.`lft` < `s`.`lft` AND `s`.`rgt` < `c`.`rgt`) WHERE (`c`.`extension` = :extension OR `c`.`extension` = 'system') AND `c`.`access` IN (:preparedArray1) AND `c`.`published` = 1 AND `s`.`id` = :id ORDER BY `c`.`lft`475μs3.91KBParams/libraries/src/Categories/Categories.php:375Copy
  • SELECT DISTINCT a.id, a.title, a.name, a.checked_out, a.checked_out_time, a.note, a.state, a.access, a.created_time, a.created_user_id, a.ordering, a.language, a.fieldparams, a.params, a.type, a.default_value, a.context, a.group_id, a.label, a.description, a.required, a.only_use_in_subform,l.title AS language_title, l.image AS language_image,uc.name AS editor,ag.title AS access_level,ua.name AS author_name,g.title AS group_title, g.access as group_access, g.state AS group_state, g.note as group_note FROM cms_fields AS a LEFT JOIN `cms_languages` AS l ON l.lang_code = a.language LEFT JOIN cms_users AS uc ON uc.id=a.checked_out LEFT JOIN cms_viewlevels AS ag ON ag.id = a.access LEFT JOIN cms_users AS ua ON ua.id = a.created_user_id LEFT JOIN cms_fields_groups AS g ON g.id = a.group_id LEFT JOIN `cms_fields_categories` AS fc ON fc.field_id = a.id WHERE ( (`a`.`context` = :context AND (`fc`.`category_id` IS NULL OR `fc`.`category_id` IN (:preparedArray1,:preparedArray2)) AND `a`.`access` IN (:preparedArray3)) AND (`a`.`group_id` = 0 OR `g`.`access` IN (:preparedArray4)) AND `a`.`state` = :state) AND (`a`.`group_id` = 0 OR `g`.`state` = :gstate) AND `a`.`only_use_in_subform` = :only_use_in_subform ORDER BY a.ordering ASC815μs4.06KBParams/libraries/src/MVC/Model/BaseDatabaseModel.php:164Copy
  • SELECT `a`.`id`,`a`.`title`,`a`.`catid`,`a`.`language`, CASE WHEN CHAR_LENGTH(`a`.`alias`) != 0 THEN CONCAT_WS(':', `a`.`id`, `a`.`alias`) ELSE a.id END AS `slug`, CASE WHEN CHAR_LENGTH(`cc`.`alias`) != 0 THEN CONCAT_WS(':', `cc`.`id`, `cc`.`alias`) ELSE cc.id END AS `catslug` FROM `cms_content` AS `a` LEFT JOIN `cms_categories` AS `cc` ON `cc`.`id` = `a`.`catid` WHERE `a`.`catid` = :catid AND `a`.`state` = :state AND `a`.`access` IN (:preparedArray1) AND (`publish_up` IS NULL OR `publish_up` <= :nowDate1) AND (`publish_down` IS NULL OR `publish_down` >= :nowDate2) ORDER BY CASE WHEN `a`.`publish_up` IS NULL THEN `a`.`created` ELSE `a`.`publish_up` END DESC302μs1.7KBParams/plugins/content/pagenavigation/src/Extension/PageNavigation.php:188Copy
  • SELECT `m`.`id`,`m`.`title`,`m`.`module`,`m`.`position`,`m`.`content`,`m`.`showtitle`,`m`.`params`,`mm`.`menuid` FROM `cms_modules` AS `m` LEFT JOIN `cms_modules_menu` AS `mm` ON `mm`.`moduleid` = `m`.`id` LEFT JOIN `cms_extensions` AS `e` ON `e`.`element` = `m`.`module` AND `e`.`client_id` = `m`.`client_id` WHERE ( ( (`m`.`published` = 1 AND `e`.`enabled` = 1 AND `m`.`client_id` = :clientId AND `m`.`access` IN (:preparedArray1)) AND (`m`.`publish_up` IS NULL OR `m`.`publish_up` <= :publishUp)) AND (`m`.`publish_down` IS NULL OR `m`.`publish_down` >= :publishDown)) AND (`mm`.`menuid` = :itemId OR `mm`.`menuid` <= 0) ORDER BY `m`.`position`,`m`.`ordering`396μs1.83KBParams/libraries/src/Cache/Controller/CallbackController.php:51Copy
  • SELECT * FROM `cms_schemaorg` WHERE `itemId` = :itemId AND `context` = :context207μs1.55KBParams/plugins/system/schemaorg/src/Extension/Schemaorg.php:403Copy
  • SELECT `a`.`id`,`a`.`asset_id`,`a`.`title`,`a`.`alias`,`a`.`introtext`,`a`.`fulltext`,`a`.`state`,`a`.`catid`,`a`.`created`,`a`.`created_by`,`a`.`created_by_alias`,`a`.`modified`,`a`.`modified_by`,`a`.`checked_out`,`a`.`checked_out_time`,`a`.`publish_up`,`a`.`publish_down`,`a`.`images`,`a`.`urls`,`a`.`attribs`,`a`.`version`,`a`.`ordering`,`a`.`metakey`,`a`.`metadesc`,`a`.`access`,`a`.`hits`,`a`.`metadata`,`a`.`featured`,`a`.`language`,`fp`.`featured_up`,`fp`.`featured_down`,`c`.`title` AS `category_title`,`c`.`alias` AS `category_alias`,`c`.`access` AS `category_access`,`c`.`language` AS `category_language`,`fp`.`ordering`,`u`.`name` AS `author`,`parent`.`title` AS `parent_title`,`parent`.`id` AS `parent_id`,`parent`.`path` AS `parent_route`,`parent`.`alias` AS `parent_alias`,`parent`.`language` AS `parent_language`,ROUND(`v`.`rating_sum` / `v`.`rating_count`, 1) AS `rating`,`v`.`rating_count` AS `rating_count` FROM `cms_content` AS `a` INNER JOIN `cms_categories` AS `c` ON `c`.`id` = `a`.`catid` LEFT JOIN `cms_content_frontpage` AS `fp` ON `fp`.`content_id` = `a`.`id` LEFT JOIN `cms_users` AS `u` ON `u`.`id` = `a`.`created_by` LEFT JOIN `cms_categories` AS `parent` ON `parent`.`id` = `c`.`parent_id` LEFT JOIN `cms_content_rating` AS `v` ON `a`.`id` = `v`.`content_id` WHERE ( (`a`.`id` = :pk AND `c`.`published` > 0) AND (`a`.`publish_up` IS NULL OR `a`.`publish_up` <= :publishUp)) AND (`a`.`publish_down` IS NULL OR `a`.`publish_down` >= :publishDown) AND `a`.`state` IN (:preparedArray1,:preparedArray2)499μs22.17KBParams/components/com_content/src/Model/ArticleModel.php:215Copy
  • SELECT `a`.`id`,`a`.`asset_id`,`a`.`title`,`a`.`alias`,`a`.`introtext`,`a`.`fulltext`,`a`.`state`,`a`.`catid`,`a`.`created`,`a`.`created_by`,`a`.`created_by_alias`,`a`.`modified`,`a`.`modified_by`,`a`.`checked_out`,`a`.`checked_out_time`,`a`.`publish_up`,`a`.`publish_down`,`a`.`images`,`a`.`urls`,`a`.`attribs`,`a`.`version`,`a`.`ordering`,`a`.`metakey`,`a`.`metadesc`,`a`.`access`,`a`.`hits`,`a`.`metadata`,`a`.`featured`,`a`.`language`,`fp`.`featured_up`,`fp`.`featured_down`,`c`.`title` AS `category_title`,`c`.`alias` AS `category_alias`,`c`.`access` AS `category_access`,`c`.`language` AS `category_language`,`fp`.`ordering`,`u`.`name` AS `author`,`parent`.`title` AS `parent_title`,`parent`.`id` AS `parent_id`,`parent`.`path` AS `parent_route`,`parent`.`alias` AS `parent_alias`,`parent`.`language` AS `parent_language`,ROUND(`v`.`rating_sum` / `v`.`rating_count`, 1) AS `rating`,`v`.`rating_count` AS `rating_count` FROM `cms_content` AS `a` INNER JOIN `cms_categories` AS `c` ON `c`.`id` = `a`.`catid` LEFT JOIN `cms_content_frontpage` AS `fp` ON `fp`.`content_id` = `a`.`id` LEFT JOIN `cms_users` AS `u` ON `u`.`id` = `a`.`created_by` LEFT JOIN `cms_categories` AS `parent` ON `parent`.`id` = `c`.`parent_id` LEFT JOIN `cms_content_rating` AS `v` ON `a`.`id` = `v`.`content_id` WHERE ( (`a`.`id` = :pk AND `c`.`published` > 0) AND (`a`.`publish_up` IS NULL OR `a`.`publish_up` <= :publishUp)) AND (`a`.`publish_down` IS NULL OR `a`.`publish_down` >= :publishDown) AND `a`.`state` IN (:preparedArray1,:preparedArray2)329μs22.17KBParams/components/com_content/src/Model/ArticleModel.php:215Copy
  • SELECT SUM(CASE WHEN `a`.`next_execution` <= :now THEN 1 ELSE 0 END) AS due_count,SUM(CASE WHEN `a`.`locked` IS NULL THEN 0 ELSE 1 END) AS locked_count FROM `cms_scheduler_tasks` AS `a` WHERE `a`.`state` = 1164μs1.37KBParams/administrator/components/com_scheduler/src/Model/TasksModel.php:517Copy
  • SELECT `session_id` FROM `cms_session` WHERE `session_id` = ?142μs1KBParams/libraries/vendor/joomla/session/src/Handler/DatabaseHandler.php:277Copy
  • UPDATE `cms_session` SET `data` = ? , `time` = ? WHERE `session_id` = ?486μs592BParams/libraries/vendor/joomla/session/src/Handler/DatabaseHandler.php:301Copy