2013-04-30 2 views
1

Я переключил свой блог с одной системы CMS/Blog на Habari, у которого есть некоторые правила перезаписи Apache по умолчанию, и я пытаюсь перенаправить все старые URL статьи от /articles/article-name до /article-name. Ниже я опубликовал, что переписываю URL, который я использую, и значения по умолчанию, входящие в систему Habari, я думаю, что это может быть проблема размещения. Должны ли мои перезаписи быть выше их?Apache Rewrite Rule с Habari Default Rewrites

Habari По умолчанию Apache Rwrites:

RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_URI} !=/favicon.ico 
RewriteBase/
RewriteRule . index.php [PT] 
RewriteRule ^(system/(classes|handlers|locale|schema|$)) index.php [PT] 

Мой URL Rewrite пристегивается к концу Правил Habari перезаписи

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

ответ

1

Да, вы хотите, чтобы вставить правило в определенном месте в следующем порядке:

... 
RewriteBase/
RewriteRule ^/articles/(.*)$ /$1 [R=301,PT] 
RewriteRule . index.php [PT] 
... 

Это позволит вашему старому URL переписать, а затем Habari может обрабатывать повторно письменный запрос.

+0

Дал вам проголосовать за правильный ответ, но это один из тех мест, которые я пробовал раньше, и я снова попробовал еще ничего, я не могу понять, почему он не работает, спасибо. – ars265

1

Примечание: Я знаю один ответ уже был принят, но, возможно, это один будет решить вашу проблему:

Ваше правило: RewriteRule ^/articles/(.*)$ /$1 [R=301,PT]

Если правило находится внутри одного .htacces файл, он не работает, потому что:

«... Поэтому шаблон с ^/никогда не совпадает в контексте контекста ...»(Выдержки из Per-directory Rewrites)

При использовании в файлах .htaccess, правило должно быть:

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

Однако, если каталог /articles не существует, используется первое правило и ваш никогда не будет применяться, поскольку первый создает новый запрос.

Если это так, то вы должны изменить текущий код, чтобы:

RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_URI} !=/favicon.ico 
RewriteBase/

# Add next line if directory "/articles" doesn't exist. 
# If exists, the previous condition "%{REQUEST_FILENAME} !-d" 
# will exclude it from the rule. 
RewriteCond %{REQUEST_URI} !/articles [NC] 

RewriteRule . index.php [PT] 

# Add new rule 
RewriteRule ^articles/(.*) /$1 [R=301,PT,NC] 

RewriteRule ^(system/(classes|handlers|locale|schema|$)) index.php [PT] 

Вышеуказанные изменения также действительны для кода в основных конфигурационных файлах Apache, за исключением того, правило перезаписи должно быть:

RewriteRule ^/articles/(.*) /$1 [R=301,PT,NC] 

Как правило в вашем вопросе.

+0

Я очень благодарю вас за ваш ответ, но это все еще не работает правильно для меня. Я уже понял, что/перед публикациями нужно удалить. – ars265

+0

Где находится файл .htaccess и какова ошибка или проблема? Убедитесь, что кеш браузера очищен до любого теста. –

+0

Насколько я могу судить по тестированию на http://martinmelin.se/rewrite-rule-tester/, они должны работать, пытаться очищать кеши и все остальное. Любые идеи приветствуются. – ars265

0

Описание: Предоставляет основанную на правилах переписывания двигателя переписывать запрашиваемые URL-адресов на лету Статус: Расширение модуля Идентификатор: rewrite_module Источник файла: mod_rewrite.c Резюме Модуль mod_rewrite использует основанный на правилах переписывания двигателя, на основе парсера регулярных выражений PCRE, чтобы переписать запрошенные URL-адреса «на лету». По умолчанию mod_rewrite сопоставляет URL-адрес пути к файловой системе. Однако он также может использоваться для перенаправления одного URL-адреса на другой URL-адрес или для вызова внутренней выборки прокси.

mod_rewrite обеспечивает гибкий и мощный способ манипулирования URL-адресами с использованием неограниченного количества правил.Каждое правило может иметь неограниченное количество прилагаемых условий правила, чтобы вы могли переписать URL на основе переменных сервера, переменных среды, заголовков HTTP или штампов времени.

mod_rewrite работает с полным URL-адресом, включая раздел «Информация о пути». Правило перезаписи можно вызвать в httpd.conf или в .htaccess. Путь, созданный правилом перезаписи, может включать строку запроса или может привести к внутренней подпроцессе, перенаправлению внешнего запроса или внутренней пропускной способности прокси.

Дополнительная информация, обсуждение и примеры приведены в подробной документации mod_rewrite.

Директивы RewriteBase RewriteCond RewriteEngine RewriteMap RewriteOptions RewriteRule Темы Logging Комментарии топ Logging

mod_rewrite предлагает подробное протоколирование своих действий в trace1 для trace8 входа уровней. Уровень журнала может быть определен специально для mod_rewrite с использованием директивы LogLevel: до уровня отладки, никаких действий не регистрируется, а trace8 означает, что практически все действия регистрируются.

Использование высокого уровня журнала трассировки для mod_rewrite значительно замедлит ваш HTTP-сервер Apache! Используйте уровень журнала выше, чем trace2, только для отладки! Пример

LogLevel предупреждение переписан: trace3 RewriteLog

Те, кто знаком с более ранними версиями mod_rewrite, без сомнения, будут искать директивы RewriteLog и RewriteLogLevel. Эта функциональность была полностью заменена новой конфигурацией регистрации каждого модуля, упомянутой выше. Чтобы получить только mod_rewrite конкретных сообщений журнала, трубы файл журнала через Grep: хвоста -f error_log | fgrep «[перепишет:»