Zend Framework / index / перенаправить через htaccess, чтобы избежать дублирования контента - PullRequest
0 голосов
/ 12 февраля 2012

Я хотел бы знать, возможно ли добавить правило htaccess моего приложения ZF для перенаправления всех URL-адресов, заканчивающихся сегментом /index/ (например, http://domain.ext/index/), на тот же URL-адрес без/index/ суффикс.

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

RedirectMatch ^(.*)/(index(/)?)$ http://localhost$1

, но оно не работает должным образом (с другими фреймворками, такими как FuelPHP, оно работает как шарм).

Я знаю, что это можно сделать через PHP с помощью плагина, но я бы хотел сделать редирект через Apache, чтобы улучшить производительность приложения.

Ответы [ 4 ]

2 голосов
/ 13 февраля 2012

Я не знаю, почему никто не прыгнул сюда, это не так сложно?

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

Аналогичная вещь с RewriteRule, который соответствует и имеет [L].L означает « Остановите процесс переписывания здесь и не применяйте больше правил переписывания».Эта цитата прямо из руководства

Теперь вам просто нужно определить логику, в каком порядке вы хотите применить определенные правила.Ваш запрос о RedirectMatch для любого / index / path, безусловно, является тем, что вы хотите иметь очень рано в начале конфигурации.Если есть совпадение, ваш конфиг закончится здесь и выполнит редирект!Браузер отправит новый запрос, и у нас будет новая игра.

RewriteRule для index.php мы добавим очень поздно внизу.Это может быть нашим последним средством, как , если все не получается, тогда правило .Мне не важно, является ли это Zend Framework или любым другим приложением, которое вы используете для этого через index.php или другой скрипт.

Следующие правила должны охватывать любые вариации с индексом, включая .php, .htm.и .html и, наконец, вызовите файл index.php для вашего приложения ZF.

RedirectMatch ^(/.*)/(index.(php|html|htm)|index)/?$ $1 

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d 
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ index.php [NC,L]

При тестировании правил перенаправления будьте осторожны с вашим браузером и используйте тот, где вы можете полностью сбросить все настройки кэша и истории.Все современные браузеры печально известны «запоминанием» перенаправлений.Если они выучили правило перенаправления, они выполнят это внутреннее перенаправление, то есть они не пойдут на сервер, чтобы посмотреть, что нового!

0 голосов
/ 03 марта 2014
RewriteRule ^(.*)/index(?|$)$ $1$2 [R=301,L]

это работает с URL

/index => /
/index?page=2 => /?page2
/index/index => /
/index/index?page=2 /?page2

вам нужно удалить косую черту перед, для URL, как / index /, index / index /

RewriteRule ^(.*)/$ /$1 [L,R=301]

url like / index / help будет работать без изменений

0 голосов
/ 13 февраля 2012

Я решил свою проблему с помощью этого (ужасного) обходного пути: - Я переименовал действие index в IndexController в «home» - Я установил статический маршрут для домашней страницы ( source ) - Я изменилhtaccess to:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^(.*)home(/)?$ $1 [R=301,L]
RewriteRule ^(.*)index/(.*)$ $1$2 [R=301,L]
RewriteRule ^.*$ index.php [QSA,NC,L]

Так что теперь домашняя страница не дублируется, поскольку http://localhost/home/ перенаправляется на базовый домен и для других контроллеров действие index, если оно вызывается с указанием имени действия (/ controller / index / param / value) перенаправляется на нужный URL-адрес (/ controller / param / value /)

0 голосов
/ 12 февраля 2012

Вот ваш набор правил, выложенный для чтения

RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR] 
RewriteCond %{REQUEST_FILENAME} -d 
RedirectMatch ^(.*)/(index(/)?)$ http://localhost$1 
RewriteRule ^.*$                 -                        [NC,L] 
RewriteRule ^.*$                 index.php                [NC,L]

RedirectMatch - это директива mod_alias, которая отделяет conds от их правила.Кроме того, это гораздо менее опасно, если не смешивать директивы mod_alias и mod_rewrite, поэтому попробуйте:

RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR] 
RewriteCond %{REQUEST_FILENAME} -d 
RewriteRule ^                   -                        [L] 

RewriteRule ^(.*?)/index/?$     $1                       [R=301,L] 

RewriteRule ^.*$                index.php                [NC,L]

(обновлено после комментариев авторов)

Больше сносок

Я попробовал это на моя виртуальная машина , которая отражает мою службу хостинга, но, имея root-доступ, я вижу журналы перезаписи «производства».Это терпит неудачу, потому что второе правило все еще переходит к правилу (3), которое отправляет в index.php.Это затем возвращает полный контент, но с состоянием 301 и без выдачи нового местоположения.Если я изменю [R=301] на [R=301,L], он будет работать нормально, так как сервер теперь выдает 301 с заголовком Location, и браузер теперь повторяет попытку с новым расположением.

Документация состояния:

Вы почти всегда захотите использовать [R] в сочетании с [L] (то есть использовать [R, L]), поскольку сам по себе флаг [R]предварительно добавляет http://thishost[:thisport] к URI, но затем передает это следующему правилу в наборе правил, что часто может привести к предупреждениям «Недопустимый URI в запросе».

...