(Concrete5 SEO Guide originally published by Tony at: http://concrete5packages.com/concrete5_blog/concrete5-seo-tips. See original article for many links to reference sources.)
Here I'm going to be touching on some of the Concrete5 specific SEO techniques as they relate to more general search engine optimization, with an emphasis on Google since it's become most people's go-to search engine. If you are new to how Google indexes and ranks webpages, you might want to take a moment to read Google's Search Engine Optimization Starter Guide. Veteran Concrete5 developers will be familiar with most of these SEO tips, but I'm going through this process with another site at the moment, so thought I'd write it down while it's fresh in my mind.
Before you worry about how well you rank in the search engines, you need to make sure your website's content gets added to their index. This section will walk you through what's involved with indexing, including submitting your site, generating your sitemap, and restricting access.
Verification in Webmaster Tools
If you're serious about improving your website's visibility on Google, one of the first things you'll want to do is verify your site so that you can use Google's Webmaster Tools (https://www.google.com/webmasters/tools/home?hl=en). This service helps you track how well Google is crawling your site, and if it's running into any problems. Google provides a few ways to verify your site. With Concrete5 one of the easiest ways is by pasting a meta tag provided by Google into your homepage's Header Extra Content page attribute. This will then be added to your homepage's head tag. You can find this interface under the Custom Attributes tab of your Page Properties interface (you'll probably have to choose it from the select field at the top).
Asking for an Index with Sitemap.xml
The next step you should take is to get your website generating a sitemap.xml file. This allows Google to easily be notified when new content is added to your site, making sure all of your pages get indexed. Generating a sitemap isn't essential in getting indexed. Crawlers will travel through links, indexing what they find. But it does make the process more efficient.
Your sitemap is generated with a Concrete5 Job called "Generate Sitemap File", run from the System & Maintenance section of your site's dashboard. If you've never done this before, you may have to first create a file called sitemap.xml within your website's root directory, and give it the correct permissions so that your server can write to it. After creating your sitemap, submit the url (like http://yoursite.com/sitemap.xml) to Google Webmaster Tools.
By default, the sitemap job is only set up to be run manually, so you should remember to regenerate it periodically after adding new content to your site. With some system admin skills, you can also automate your jobs, using linux's scheduling program cron & the url provided on your dashboard's jobs page.
While Google uses many factors in their ranking algorithms, one of the variables that it takes into account is your sitemap's page priority. This setting is a decimal between 0 and 1, and it lets you hint at particular pages that should be ranked higher than others. Unfortunately, unless you override it, this defaults in Concrete5 to a random number (feel free to leave a comment if you know the reason for this). My recommendation is that you copy your generate_sitemap.php into the root /jobs directory, and then hardcode that to default to something like 0.5. But for most of your pages you're probably better off manually setting a priority based on the importance of the page. To enable this, you must first create a new page attribute with a handle of "sitemap_priority".
There may be times when you don't want a particular page to get included within your sitemap. For pages like this, Concrete5 comes installed with a page attribute named "Exclude From sitemap.xml". But setting this variable for a page doesn't necessarily mean that it won't get indexed by Google. It just means you won't be explicitly asking for a crawl. So you should also set the "Exclude from Search Index" for these pages, which will add a Robots noindex meta tag to your page's head.
Restricting Access with Robots.txt
Concrete5 also comes installed with a robots.txt file, which limits crawlers access to certain files and folders on the site. However, you might want to comment out the line in that file pointing to the /themes folder. Google now attempts to load a preview of your site, and by default it won't be able to load your theme's images, resulting in a broken site preview. You can check what your website snapshot looks like within Google Webmaster Tools.
So how do you get your Concrete5 webpages to rank well in Google? Search engines use a complex mix of factors when ranking your pages. For the most part these have little to do with your choice of website framework. The fundamentals of search engine optimization still apply, and fine tuning your site for better ranking is often a slow process. Your choice of framework shouldn't be overemphasized in determining how well you rank. Instead most of your attention here should be paid to things like creating relevant content, well structured html, and site popularity. But in a number of ways Concrete5 manages to make this process simpler.
A good place to start here is with keyword targeting, both for your website as a whole and for individual pages. Try to target each page for just one or two key terms. You can use services such as Google Insights or Keyword Tool to determine which searches are more popular. And then you can use keyword density checkers to see your page's relevance for a given search term. Don't go overboard though. Google's good at detecting when keyword stuffing becomes unnatural, and your site will be penalized for being spammy. Keyword density probably shouldn't go above 2-3% for a given phrase.
Generating SEO Friendly Markup
Concrete5 does a good job on the keywords optimization front, particularly by producing informative markup. It automatically adds a title tag to your pages, and allows you to create understandable, search engine friendly URLs. Try to use a h1 tags for your keyword optimized page titles, and h2 or h3 for subheadings. You should design your Themes with this in mind. These tags will be listed as Heading 1, Heading 2, etc. within the Content block. When adding images, take the time to enter alt tag values, so search engines will know what the image contains. And when linking to other pages on your site, use relevant keywords within the link tag.
Search engines will also use keywords within your urls to determine relevancy. Keep this in mind when creating new pages. Allegedly it's better to separate each word with a dash instead of with an underscore. You'll also want to enable pretty urls, to remove the index.php from the address, and as an added bonus will make the url more readable.
Preventing Duplicate Content
To prevent duplicate content problems set up Canonical URLs to your pages. Unfortunately some customization is required to get these going with concrete5, but it looks like it comes with the SEO Manager package too. Speaking of URLs, if you need to move a page, be sure to create a page alias for the old address. Concrete5 will automatically set up a 301 permanent redirect header, which will make Google happy.
While keywords are important, Google's big innovation that set it apart from other search engines is PageRank. Basically, this is a score given to your webpage based on the number of inbound links, and importance of those linking pages. The diagram here shows a simplified version of how the PageRank algorithm works. In short, what this means is that you should try to get quality inbound links to your site (one's that don't use rel="nofollow"). You can keep track of these referring sites with tools like Google Analytics or the homegrown Concrete5 Traffic & Statistics package (which also comes in a package deal with the SEO Manager). In addition to inbound links, Google's now also starting to use social sharing data in their rankle algorithm, like google +1 likes, so you may want to experiment with these.
Google is also now starting to incorporate site load speed into their ranking algorithm, so your site's load performance may influence it ranking. I can't say how much this factors into ranking yet, but it's something to be aware of. You can examine the loading process with tools like the PageSpeed or YSlow browser plugins. This is one area where Concrete5 doesn't necessarily excel by default, such as in regards to the loading of block's external scripts & styles, although it sounds like this may soon be resolved in an upcoming release. With a little work you can still get an A rating for your Concrete5 site with these performance testing tools. Many of their suggested tweaks need to be done to your server configuration and so aren't dependent upon the framework. Be sure when doing performance testing that you're logged out of the site, since this is how crawlers will be interpreting the page.
Just getting ranked high up in the search results doesn't necessarily mean that you're going to get a click-thru. Much of that depends on how your site appears within Google. You can customize how your site is displayed in their search results by setting your page's meta-description & meta-title attributes (also found under Page Properties -> Custom Attributes). To get people to actually click through to your site, it needs to be relevant to what they're actually looking for, so take the time to enter meaningful values for these attributes. Note that the values that you set for this should only influence the text that's displayed, and not how well your site ranks. The meta-keywords tag isn't really used by major search engines anymore either, so it's probably safe to ignore. Check out this video for more information on how Google uses meta-tags.