What Sitecore Climber mentioned for Static Renderings in a layout is correct. However I think you also asked how you would vary the cache by a page (or section). VaryBySection doesn't exist, neither does VaryByUrl. But you can add custom Vary By logic pretty easily. On my blog: http://sitecoremaster.com/caching/customizing-html-caching-with-sitecore-with-mvc/ I talk about how you can do this.
So to achieve a Vary By Url, you would need to extend the GenerateCacheKey pipeline in RenderRendering processor group, using code like this:
public class GenerateCacheKey :
private const string VARYBYURL = "VaryByUrl";
protected override string GenerateKey(Rendering rendering, RenderRenderingArgs args)
string cacheKey = base.GenerateKey(rendering, args);
Item renderingItem = rendering.RenderingItem.InnerItem;
cacheKey += "_#url:" + Sitecore.Context.RawUrl;
And you would patch it by using the following code:
<processor patch:instead="processor[@type='Sitecore.Mvc.Pipelines.Response.RenderRendering.GenerateCacheKey, Sitecore.Mvc']"
type="Site.Infrastructure.Pipelines.Renderings.GenerateCacheKey, Site.Infrastructure" />
You would need to extend /sitecore/templates/System/Layout/Sections/Caching to include the checkbox option to "VaryByUrl" for the rendering that you've defined.