Legacy Documentation
You are using the documentation for version 3.5.17. Go here for the latest version or check here for your available upgrades to the latest version.
URL Structure¶
Pages (Templates) are organized in Template Groups. To access a Template within a Template Group you’ll use this URL structure:
http://example.com/index.php/template_group/template
For example: If you want to access the “archives” Template within the “site” Template Group you’ll use this:
http://example.com/index.php/site/archives
The Concept¶
The goal was to make the URLs produced by ExpressionEngine search-engine friendly by making the URL structure mimic a traditional static site. In order to accomplish this, the use of query strings was eliminated from the URLs.
Most dynamic publishing systems use query strings. That is, URLs that look like this:
http://example.com/index.php?id=2&page=1
Notice the question mark and ampersand? Those are part of a “query string”. These enable dynamic systems to fetch and display specific information. Query strings, however, are disliked by search engines, which limit the amount of dynamic information they catalog. For that reason, query strings have been eliminated completely from ExpressionEngine. Instead, its URLs are segment driven, like this:
http://example.com/index.php/site/archives
Viewing your Site¶
Because you don’t actually have physical pages on your site, the URL you use will determine what you see on your site. At its simplest, you access pages on your site using this URL formula:
http://example.com/index.php/template_group/template
Notice that the Template Group and Template are contained in the URL. An Example: Let’s say you create a Template Group called “channel”, and within it you create a Template called “about_me”. To access it you will use the following URL:
http://example.com/index.php/channel/about_me
If you only specify the Template Group in the URL (and leave off a Template name), EE assumes you want to show the “index” template for that group:
http://example.com/index.php/channel
The above URL is identical to doing this:
http://example.com/index.php/channel/index
Note
It is best if you always specify the Template Group name when you access content.
Entries and Other Things¶
That isn’t all, though. You’ll often have URLs on your site that point to a specific channel entry, category, or other things. For instance, you might have a URL like this:
http://example.com/index.php/channel/comments/147
This URL tells EE to display the channel entry number 147 using the “comments” Template in the “channel” Template Group. So, EE knows what to display and where/how to display it. You can also use a “URL Title” to indicate a specific entry instead of the entry number. URL Titles are specified when you create an entry. So, the URL might be:
http://example.com/index.php/channel/comments/my_url_title
Again, “channel” is the Template Group, “comments” is the Template, and now “my_url_title” is the URL Title for the entry to be displayed. Similarly, you might display a single category in your archives:
http://example.com/index.php/channel/archives/C13
Here, the URL indicates to display the category with the Category ID of “13” using the “archives” Template in the “channel” Template Group.
Query Strings¶
Some web servers — typically Windows-based servers — still have difficulty with the default ExpressionEngine setup that doesn’t use query strings. In cases like this, you can tell the system to Force URL Query Strings under
.With this option enabled, the URLs output by ExpressionEngine are slightly different, but still far more readable and search engine-friendly than a typical dynamic system might output. With Force URL Query Strings turned on, an ExpressionEngine URL might look like this:
http://example.com/index.php?/site/archives
You’ll notice that it is almost identical to the regular setting, only with the addition of the question mark.
In a select few cases, turning on Force URL Query Strings by itself won’t be enough. If URLs continue to not work even with that setting on, then open system/user/config/config.php and set:
$config['uri_protocol'] = 'QUERY_STRING';