What exactly is a baseUrl

okey_on picture okey_on · Feb 21, 2013 · Viewed 56.8k times · Source

I have spent sometime trying to understand what a baseUrl is(from learning Zend Framework), but it's surprising that for such a ubiquitous utility, not a single "expert" or blogger has even attempted to define baseUrl so that a learner has an idea what it is about. They all assume you know what it is and then proceed to derive it, each one employing his own method to arrive at his own result. From what I'd read so far:

Some think it is a Homepage-Url, which is what I'd naturally think it is(as implied from the name), to be accessed by $_SERVER["HTTP_HOST"] or $_SERVER["SERVER_NAME"] but surprisingly these seem to be in the minority.

Some think it is a current page to be accessed by $_SERVER["REQUEST_URI"] or $_SERVER["PHP_SELF"] appended to server-name

while others think it can be any of the above or any url for that matter(well, at least that's the impression I get), depending on how the user wants to use it.

So can someone please explain exactly what a baseUrl is, without assuming I'm also "expert" and why I might need it. Thank you.

EDIT: The baseUrl is supposed to be automatically set on most Zend projects, but apparently not in my case. Even when I do an echo $this->baseUrl() or var_dump($this->baseUrl()), I get nothing. So I really have no idea what this utility is about.

Answer

David Weinraub picture David Weinraub · Feb 21, 2013

The short answer for why you need to have a baseUrl() facility is this:

Where the app is deployed should be a configuration issue, not a core application-functionality issue

In many - perhaps even most - cases, the base-url of the application will simply be $_SERVER['HTTP_HOST'] or $_SERVER['SERVER_NAME'].

But that's not always the case.

The easiest example to consider is a standard website that has the usual pages:

  • http://example.com/
  • http://example.com/contact
  • http://example.com/about
  • // etc

Now you write (or buy or download as an OSS package) a blog application that you would like to deploy under the url:

http://example.com/blog

The blog could have links like:

  • http://example.com/blog/post/my-post-slug
  • http://example.com/blog/categories/some-category
  • //etc

All these links reside under /blog.

The blog application itself should be concerned only with links/pages/routing inside the blog. Though your blog templates may very well contain header/footer links back to the rest of the site, the rest of the core blog application functionality should not have to know about of the rest of your site. Somehow, the blog application needs to know that when he generates links to blog posts and blog categories and all his other blog-related pages, they all must be prefixed with http://example.com/blog.

The values $_SERVER['HTTP_HOST'] or $_SERVER['SERVER_NAME'] do not reflect this environment/deployment information. Configuring (!) the app with a base-url value and consistently using some kind of baseUrl() function (that consumes this config) when generating links is a good way to keep your core application functionality focused on its own business and not on external deployment factors.