Базовая статическая перезапись (или перенаправление) через htaccess или httpd.conf - PullRequest
0 голосов
/ 13 августа 2010

Мы переходим с одного языка сайта / CMS (coldfusion / custom) на другой (PHP / Drupal) и нам нужно перенаправить некоторые из наших старых страниц на новые.У меня есть доступ как к .htaccess, так и к httpd.conf (и apache2.conf), так как это vps на Linode.

Большинство из них нельзя сделать с помощью регулярного выражения (они содержат GUID в URL) ивсе в порядке, мы пишем статические перенаправления.

Вот пример:

  RewriteRule /show.cfm/FG3f4-30F1G/ http://www.mysite.com/john-smith [R=301]

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

У меня может быть неправильное представление о том, какую роль играет RewriteCond - в .htaccess уже есть другие строки.

  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteCond %{REQUEST_URI} !=/favicon.ico
  RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]

Нужно ли повторнообъявить RewriteCond после того, как указан RewriteRule?

Кроме того, в идеале, чтобы сохранить чистоту в .htaccess, я хотел бы использовать RewriteMap, где я могу указать один текстовый файл и иметь только два табуляции с разделителямистолбцы «старый URL | новый URL» ... но я не могу заставить это работать тоже (если это даже уместно использовать).

Любые идеи будут приветствоваться ...

Ответы [ 3 ]

0 голосов
/ 13 августа 2010

Как указали Cags , если вы определяете свои правила в файле .htaccess, вам необходимо убедиться, что пути не содержат косую черту.Кроме того, вам, вероятно, нужно убедиться, что вы используете флаг L, а также располагаете правила перенаправления над разделом переписывания WordPress, поскольку обе эти вещи могут в итоге привести к конфликту.

Дляпример:

RewriteRule ^/?show.cfm/FG3f4-30F1G/$ http://www.mysite.com/john-smith [R=301,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !=/favicon.ico
RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]

Если вы хотите использовать RewriteMap, вам необходимо определить его в конфигурации вашего сервера или виртуального сервера.Обычно это проблема для большинства людей, но, поскольку вы указали, что используете VPS, я бы предположил, что у вас есть необходимый доступ.Обратите внимание, что по соображениям эффективности было бы также полезно поместить все ваши директивы mod_rewrite, поскольку .htaccess необходимо анализировать для каждого запроса (но конфигурация сервера обрабатывается только при запуске).

Определение карты сервера будет выглядеть следующим образом: httpd.conf (или эквивалент):

RewriteMap redirect-map txt:/full/path/to/file/pathmap.txt

Затем вы измените свое правило соответствующим образом:

RewriteRule ^/?(show\.cfm/[A-Za-z0-9-]+/)$ http://www.example.com/${redirect-map:$1} [R=301,L]

... сpathmap.txt выглядит примерно так:

# Input                Replacement
show.cfm/FG3f4-30F1G/  john-smith
show.cfm/ABC12-40000/  jane-doe
...
0 голосов
/ 30 октября 2014

Если вы используете VPS "Linode", вам также необходимо обновить файл конфигурации вашего виртуального хоста до строки "AllowOverride All" из "AllowOverride None".

Обычно на LInode этот файл конфигурации находится в каталоге "/ etc / apache2 / sites-enabled". Без изменения файлов в этом каталоге Rewrite Engine на Linode не будет работать.

0 голосов
/ 13 августа 2010

Для вашего первого статического примера вам лучше использовать директиву Redirect, а не mod_rewrites RedirectRule.

RewriteCond применяется только к RewriteRule, который непосредственно следует за ним. Таким образом, в вашем операторе conds указывает, что запрошенный URI не является реальным файлом или директорией и не является значком, а затем перенаправьте его на index.php

Что касается того, что вы пытаетесь сделать это с помощью карата, а он не работает, то, скорее всего, это проблема путей, и точное решение зависит от того, находится ли RewriteRule в файле httpd.conf или в .htaccess. Как правило, шаблонам правил, которым вы соответствуете в httpd.conf, предшествует косая черта, тогда как шаблонам, с которыми вы сопоставляете в файле .htaccess, не будет.

...