Custom URLs in Zend Framework (v1.6.1)
If you are having problems with custom URLs in Zend Framework – you’re not alone.
Recently I was rewriting one of my websites using ZF. The site is old, well ranked in search engines. In a situation like this you don’t really want to change URL structure. So i started to play with Apache rewrite rules and got stuck.
The problem is, that by default HTTP request object is using $_SERVER['REQUEST_URI'] which means that even after setting rule like
RewriteRule ^articles/(.*)$ articles/view/url/$1 [L]
won’t work, because $_SERVER['REQUEST_URI'] remains unchanged.
To fix this, I’ve changed Http.php in library/Zend/Controller/Request/ and on line 391(should be the same if you are using same version as me, or look for public function setRequestUri($requestUri = null) ) and replaced
389: if (isset($_SERVER['HTTP_X_REWRITE_URL'])) { // check this first so IIS will catch
390: $requestUri = $_SERVER['HTTP_X_REWRITE_URL'];
391: }elseif (isset($_SERVER['REQUEST_URI'])) {
394: $requestUri = $_SERVER['REQUEST_URI'];
395: }elseif (isset($_SERVER['ORIG_PATH_INFO'])) { // IIS 5.0, PHP as CGI
with:
389: if (isset($_SERVER['HTTP_X_REWRITE_URL'])) { // check this first so IIS will catch
390: $requestUri = $_SERVER['HTTP_X_REWRITE_URL'];
391: }elseif(isset($_SERVER['PATH_INFO'])){
392: $requestUri = $_SERVER['PATH_INFO'];
393: }elseif (isset($_SERVER['REQUEST_URI'])) {
394: $requestUri = $_SERVER['REQUEST_URI'];
395: } elseif (isset($_SERVER['ORIG_PATH_INFO'])) { // IIS 5.0, PHP as CGI
It’s a quite dirty hack because you have to change core files and need to remember that before updating ZF to a new version, but it does the job.
If you know a better solution – please let me know!
June 25th, 2009 at 9:05 pm
[...] I care about URL’s much, to make search engines happy mostly I’m using this trick for custom URL’s with Zend Framework And the reason why it stopped working is that 1and1 is not giving you $_SERVER['PATH_INFO'] any [...]
October 4th, 2010 at 9:06 pm
Hi, I’m developing cms with zend I have problem
I have modules : core, category, …
how can I access these modules using this url:
http://localhost/admin/category
note: admin just is a prefix
October 4th, 2010 at 9:22 pm
Not sure if I understand your question correctly but if you have module “core”, placed in application/modules/default/controllers/CoreController.php and if this controller has a public indexAction, then you should be able to access it via [yourWebsitesUrl]/core
If it doesn’t work, send more details – where the files are stored, names etc.
October 4th, 2010 at 9:53 pm
I can access all modules like:
http://localhost/category
but I want to access them via:
http://localhost/admin/category
maybe some routing required
March 17th, 2011 at 10:17 pm
You can use routing, or another simple solution would be to use mod_rewrite and make all pages that go to /admin go to a different controller