Как решить случай, когда пользователи переходят на index.php
В среде Zend, использующей MVC, если пользователь A явно просматривает http://base/url/index.php вместо просто http://base/url, система считает, что реальным базовым URL является http://base/url/index.php/ и в соответствии с этим вычисляет все URL в системе.
Итак, если у меня есть контроллер XXX и действие YYY Ссылка будет
http://base/url/index.php/XXX/YYY что, конечно, неправильно.
В настоящее время я решаю эту проблему, добавив строку в index.php:
$_SERVER["REQUEST_URI"]=str_replace('index.php','',$_SERVER["REQUEST_URI"]);
Мне интересно, есть ли встроенный способ в ZF, чтобы решить эту проблему.
6 ответов
Вы можете сделать это с ZF, используя Zend_Controller_Router_Route_Static
(фу!), пример:
Прочитайте ссылку на страницу руководства, приведенную выше, есть несколько довольно хороших примеров.
$route = new Zend_Controller_Router_Route_Static(
'index.php',
array('controller' => 'index', 'action' => 'index')
);
$router->addRoute('index', $route);
Не могу сказать, что я полностью не согласен с вашим подходом. Тем не менее, другие могут указать на 5000 или около того недостатков. Удачи с этим.
Используйте mod_rewrite. Примерно так должно это сделать:
RewriteRule ^index.php/(.*)$ /$1 [r=301,L]
Ну, это действительно зависит от того, как вы хотите решить это. Как вы знаете, Zend Frameworks строится на шаблоне фронт-контроллера, где каждый запрос, который явно не ссылается на файл в каталоге / public, перенаправляется в index.php. Таким образом, вы можете решить эту проблему несколькими способами:
- Отредактируйте файл.htaccess (или директиву конфигурации сервера), чтобы переписать запрос на желаемый:
- RewriteRule (. * Index.php) /error/ запрещено? Req=$1 // Переписать запрещенное действие контроллера ошибок.
- RewriteRule index.php /index // Переписать запрос на основной контроллер и действие
- Добавьте статический маршрут в ваш загрузчик, как предложено karim79.
На мой взгляд, если у меня есть веб-сайт, работающий на PHP, и пользователь заходит на http://site/index.aspx я бы отправил 404.
Несмотря на то, что index.php существует в теории, он не является допустимым URL-адресом в моем приложении, поэтому я бы отправил 404 и в этом случае.
Я не думаю, что вы должны использовать маршрут, чтобы сделать это.
Это своего рода общая проблема, которая не должна решаться таким образом.
Вам лучше сделать это в вашем.htaccess, который предложит вам лучший и простой способ перенаправить пользователя туда, куда вы хотите, например, на страницу с ошибкой или на индекс.
Вот страница документации для mod_rewrite
Я никогда не сталкивался с этой проблемой при использовании Zend Framework. просто не делайте ссылки на файл index.php. вот и все. и когда вы даете адрес вашего приложения пользователям, просто скажите им, чтобы перейти на http://base/url/
когда пользователь вводит http://base/url/ ее URI запроса равен base / url, а ваш файл.htaccess направляет запрос в index.php, но запрос IS base / url. вам не нужно удалять index.php из запроса. потому что его там нет.
когда вы пытаетесь сгенерировать URL для ссылок и форм и..., используйте встроенный помощник вида url() для генерации ваших ссылок. как это:
// in some view script
<a href="<?php
echo $this->url( array('controller'=>'targetController','action'=>'targetAction') );
?>" >click</a>
не беспокойся о ссылке. Zend создаст для вас URL.