Как использовать mod_rewrite с Zend Framework? - PullRequest
2 голосов
/ 31 декабря 2008

Я только что развернул новый сайт с помощью Zend Framework. В связи с популярностью моих руководств, я бы хотел перенаправить любой запрос учебника на соответствующую страницу нового сайта. Пока это то, что у меня есть:

URL перед перезаписью: http://neranjara.org/tutorials/?tid=56

URL после перезаписи: http://neranjara.org/article/id/56

Файл .htaccess, который я пытаюсь использовать, выглядит следующим образом:

  $ cat html/.htaccess
  RewriteEngine on

  RewriteRule tutorials/\?tid=(.*)$ /article/id/$1 [R=301]
  RewriteRule !\.(js|ico|gif|jpg|png|css|xml|phps)$ index.php

Но это правило не соответствует ни одному URL-адресу ...: '(

Кто-нибудь видит здесь проблему?

Ответы [ 3 ]

3 голосов
/ 02 января 2009

На основании вашей предыдущей записи:

  $ cat html/.htaccess
  RewriteEngine on

  RewriteRule tutorials/\?tid=(.*)$ /article/id/$1 [R=301]
  RewriteRule !\.(js|ico|gif|jpg|png|css|xml|phps)$ index.php

Я бы предложил использовать это вместо:

  $ cat html/.htaccess
  RewriteEngine on

  RewriteCond %{QUERY_STRING} ^tid=([^&]*)
  RewriteRule tutorials/ /article/id/%1 [R=301, L]

  RewriteRule !\.(js|ico|gif|jpg|png|css|xml|phps)$ index.php [L]

Кстати, это всего лишь пример того, что вы можете сделать, используя переменную QUERY_STRING в mod_rewrite Мой голос переходит к «lpfavreau», так как это вариант № 2 из их ответа.

3 голосов
/ 31 декабря 2008

Строка запроса (параметры, переданные в ваш файл) не будет в RewriteRule.

Взято из http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html#rewriterule:

Шаблон не будет соответствовать против строки запроса. Вместо этого вы должен использовать RewriteCond с Переменная% {QUERY_STRING}. Вы можете, Тем не менее, создать URL-адреса в строка подстановки, содержащая часть строки запроса. Просто используйте вопросительный знак внутри замены строка, чтобы указать, что следующее текст должен быть повторно введен в Строка запроса. Когда вы хотите стереть существующая строка запроса, конец строка подстановки только с вопросительный знак. Объединить новый запрос строка со старой, используйте [QSA] флаг.

У вас есть две возможности:

  1. Удалите ваш первый RewriteRule и вместо этого выполните проверку в вашем index.php, прежде чем переходить к вашей платформе. Начальный запрос должен быть доступен в $_SERVER['REQUEST_URI'] или что-то в этом роде. Поэтому убедитесь, что это учебные пособия , примите параметр tid и продолжайте с перенаправлением:

    header("Location: http://http://neranjara.org/article/id/$id");
    exit();
    
  2. Вместо этого используйте RewriteCond с% {QUERY_STRING}, как указано в документации Apache. Это решение обсуждается в потоке, как , это .

// Редактировать:

Взгляните на ответ Криса , который был достаточно любезен, чтобы детализировать решение, используя QUERY_STRING. Это, вероятно, то, что вы хотите использовать. Спасибо Крис.

0 голосов
/ 31 декабря 2008

Zend использует всю мощь htaccess, которую может предоставить htaccess, поэтому есть очень удобный (цепной, интересный и не очень хорошо документированный) метод для достижения этой цели в начальной загрузке!

Вы должны использовать Zend Router в вашей начальной загрузке (index.php). Вероятно, что-то вроде: (это будет foo.com/article/23

$ router = $ FrontController-> getRouter ();

$ route = new Zend_Controller_Router_Route ( 'Статья /: идентификатор', массив ('id' => 1)); $ router-> addRoute ('article', $ route);

Подробнее здесь

...