Wordpress .htaccess перенаправляет расширение файла и не учитывает регистр

Я перемещаю веб-сайт на WordPress, но хочу сохранить текущую структуру URL для целей SEO.

Текущий сайт использует комбинацию файлов .htm и .html. Мне удалось перенаправить на .htm, когда запрос .html.

Например

    RedirectMatch 301 (.*)\wp-site/mywebpage.html$ http://www.mydomain.com/wp-site/mywebpage.htm

У меня проблемы со следующим:

когда файл .html имеет верхний и нижний регистр. Кажется, я не могу найти решение для перенаправления любого запроса, несмотря на случай, на его эквивалент .htm

Например: My-Posts/Alpha-Page.html должен перенаправлять на my-posts/alpha-page.htm или MY-POSTS/ALPHA-PAge.html перенаправляет на my-posts/alpha-page.htm (или любой из "my-posts/alpha-page", который содержит прописные буквы. в основном все запросы, независимо от регистра, должны перенаправляться на все строчные буквы .htm файла)

Я знаю, что это немного сложно, потому что это комбинация 1) я перенаправляюсь на .htm и 2) для нечувствительности к регистру.

Несколько вещей, которые следует учитывать:

  1. Я знаю, что сообщения Wordpress нечувствительны к регистру. Статическая страница Wordpress чувствительна к регистру.
  2. Я знаю, что RedirectMatch не будет работать, потому что он точно соответствует ему.
  3. Я считаю, что мне нужно использовать RewriteCond и RewriteRule, но я не могу найти «хороших» пошаговых объяснений. Кроме того, я не понимаю их переменные (т.е.: %{HTTP_HOSTS}) и соглашение о регулярных выражениях.
  4. Я никоим образом не являюсь экспертом по Apache/.htaccess или регулярным выражениям.

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

Любая помощь приветствуется!

Спасибо

ОБНОВЛЕНИЕ 17.06.2011:

Вот мой текущий файл .htaccess

    # BEGIN WordPress

    <IfModule mod_rewrite.c>


    RewriteEngine On


    RewriteBase /wp-test-2011-06-13/

    RewriteRule ^index\.php$ - [L]

    RewriteCond %{REQUEST_FILENAME} !-f

    RewriteCond %{REQUEST_FILENAME} !-d

    RewriteRule . /wp-test-2011-06-13/index.php


    RedirectMatch 301 (.*)\wp-test-2011-06-13/redirect.html$ http://www.mydomain.com/wp-test-2011-06-13/redirect.htm


    RewriteRule ^ORLANDO-criminal-defense-attorney/defense-attorney-NEJAME.html$ /orlando-criminal-defense-attorney/defense-attorney-nejame.htm [QSA,NC,R=301]


    </IfModule>


    # END WordPress

ОБНОВЛЕНИЕ 20.06.2011:

Вот мой текущий файл .htaccess:

    # BEGIN WordPress
    <IfModule mod_rewrite.c>

    Options +FollowSymlinks
    RewriteEngine On

    RewriteBase /wp-test-2011-06-13/
    RewriteRule ^/wp-test-2011-06-13/index\.php$ - [L]

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule .* /wp-test-2011-06-13/index.php 

    RedirectMatch 301 (.*)\wp-test-2011-06-13/redirect.html$ http://www.mydomain.com/wp-test-2011-06-13/redirect.htm

    RewriteRule ^ORLANDO-criminal-defense-attorney/defense-attorney-NEJAME\.html$ /orlando-criminal-defense-attorney/defense-attorney-nejame.htm [QSA,NC,R=301]

    </IfModule>

    # END WordPress

Я получаю страницу Wordpress «Страница не найдена», когда набираю http://www.mydomain.com/wp-test-2011-06-13/ORLANDO-criminal-defense-attorney/defense-attorney-NEJAME.html ( или эквивалент в нижнем регистре с .html)


person user801816    schedule 16.06.2011    source источник
comment
Насколько я понимаю, вы хотите: 1) изменить расширение файла в конечном URL-адресе с html на htm; 2) игнорировать регистр при перенаправлении .. или изменить URL конечной страницы на нижний регистр?   -  person LazyOne    schedule 17.06.2011
comment
1) Да. Измените запрос .html на перенаправление на .htm 2) Я считаю, что хочу игнорировать регистр. MYPAGE.html --> mypage.htm или mYPaGe.html --> mypage.htm или MYpaGE.html --> mypage.htm и т. д., игнорируя регистр запроса и перенаправляя его на нижний регистр. html-версия   -  person user801816    schedule 17.06.2011
comment
Я подумал, что что-то вроде этого может сработать. code RewriteCond %{REQUEST_URI} ^section/individual-page.html [NC] RewriteRule ^(.*)$ mydomain.com/wp-install/section/individual-page.htm/$1 [L,R=301] Думаю, я на правильном пути. [NC] должен игнорировать регистр, верно?   -  person user801816    schedule 17.06.2011


Ответы (1)


1) Да, можно "легко" сделать это с помощью mod_rewrite.. НО эти инструкции должны быть помещены в конфиг-файл (внутри тега <VirtualHost>) как RewriteMap К сожалению, директиву нельзя использовать в .htaccess.

RewriteEngine On
RewriteMap upper2lower int:tolower
RewriteRule ^/(.+)\.html$ /${upper2lower:$1}.htm [QSA,NC,R=301]

2) Если вы не можете изменить файл конфигурации, вы можете сделать хотя бы перенаправление html на htm.

RewriteRule ^(.+)\.html$ /$1.htm [QSA,NC,R=301]

Есть еще несколько вариантов, которые можно использовать с .htaccess:

3) Создавать правило перезаписи для каждой из таких страниц -- довольно неэффективно и требует постоянного обновления (новое правило для каждой новой страницы) -- здесь регистр не имеет значения:

RewriteRule ^MYPAGES/some-Page.html$ /mypages/some-page.htm [QSA,NC,R=301]

4) Сделать двухэтапное перенаправление: 1) перенаправить html в какой-то специальный файл php, который при выполнении перенаправляет на правильный URL-адрес в нижнем регистре. Выполнимо .. но некрасиво (плюс 2 задействованных перенаправления).

Если вы не можете сделать № 1, придерживайтесь № 2 и убедитесь, что вы используете <link rel="canonical" href="PROPER_URL_GOES_HERE"/> в своем <header>.

http://www.google.com/support/webmasters/bin/answer.py?answer=139394

person LazyOne    schedule 17.06.2011
comment
@LazyOne спасибо за ответ. Можно ли просто использовать шаг 3? Я не возражаю против перенаправления всех отдельных страниц, если он игнорирует регистр и перенаправляет .html на .htm. Я попытался просто поместить шаг 3) в свой .htaccess, но, похоже, он не работает. Имеет ли значение порядок моих утверждений? Перенаправление .html в .htm не обязательно должно выполняться для всех запросов; это могут быть определенные страницы (или, в данном случае, посты). - person user801816; 17.06.2011
comment
Это не шаги, а варианты (отдельно друг от друга). Но да, вы можете пойти только с № 3. Да, порядок имеет значение. Пожалуйста, покажите свой текущий .htaccess (отредактируйте исходный вопрос) — я хотел бы увидеть, куда вы пытаетесь вставить новые директивы. - person LazyOne; 17.06.2011
comment
Хорошо, я вижу ваше обновление: переместите все такие правила перенаправления (RewriteRule ^ORLANDO-criminal-defense-attorney/defense-attorney-NEJAME.html$ /orlando-criminal-defense-attorney/defense-attorney-nejame.htm [QSA,NC,R=301]) сразу после (или непосредственно перед) этого правила: RewriteRule ^index\.php$ - [L] - person LazyOne; 17.06.2011
comment
Я сделал то, что вы предложили. Неудачно. Я сделал это после и до. Нужно ли изменить параметры в скобках []? - person user801816; 17.06.2011
comment
Какое правило вы имеете в виду (про скобки [])? Все они выглядят нормально. Я думаю, что это как-то связано с этой строкой RewriteBase /wp-test-2011-06-13/ - это может повлиять на все правила. Вам нужно немного отладить его, чтобы увидеть, что происходит. Попробуйте добавить это правило RewriteRule ^(.*)$ index.php&apth=$1&uri=%{REQUEST_URI} [QSA,R=301] чуть ниже правила RewruteBase (это временно). Если это не сработает, попробуйте добавить /wp-test-2011-06-13/ перед index.php. Перейдите к любому URL-адресу, который вы хотите перенаправить, и опубликуйте, какой URL-адрес вы увидите в адресной строке после того, как это правило сработает (извините, нет простого в использовании отладчика). - person LazyOne; 17.06.2011
comment
Уверяю вас, что правила проверены и работают. Единственное, что я могу сейчас понять, почему они не работают на вашей стороне, — это эффект правила RewriteBase. Вам нужно немного изучить его. Я могу помочь советом/идеей... но не могу сделать это вместо вас отсюда. - person LazyOne; 17.06.2011
comment
Я не верю, что проблемы, с которыми я сталкиваюсь, связаны с RewriteBase /wp-test-2011-06-13/ (это определяет мою корневую папку для моих файлов wordpress и index.php). Знаете ли вы, что означают следующие строки? RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /wp-test-2011-06-13/index.php Я думаю, что мне, возможно, придется удалить, изменить или поместить строку перед/после где-нибудь в этих строках. - person user801816; 20.06.2011
comment
Первое правило перезаписи говорит ничего не делать, если запрашивается /index.php. Второе правило должно переписывать все запросы в /wp-test-2011-06-13/index.php, если запрошенный ресурс (файл или каталог) не существует. TBH Я не уверен насчет части . -- я бы использовал хотя бы .*. Я все еще думаю (ну, это единственное, что я могу сделать в этом случае отсюда), что должна быть проблема с порядком правил или путями к папкам. - person LazyOne; 20.06.2011
comment
Правило RewriteRule ^ORLANDO-criminal-defense-attorney/defense-attorney-NEJAME.html$ /orlando-criminal-defense-attorney/defense-attorney-nejame.htm [QSA,NC,R=301], можете ли вы добавить косую черту перед точкой в ​​первой половине правила -- сделайте так: RewriteRule ^ORLANDO-criminal-defense-attorney/defense-attorney-NEJAME\.html$ /orlando-criminal-defense-attorney/defense-attorney-nejame.htm [QSA,NC,R=301] - person LazyOne; 20.06.2011
comment
Я более чем убежден, что ответ заключается в том, как пишется/размещается RewriteRule. Точнее, TestString и то, как она написана: ^ORLANDO-criminal-defense-attorney/defense-attorney-NEJAME\.html$ Формат строки? Расширение файла в конце? - person user801816; 20.06.2011
comment
Правило написано правильно - на моем ПК работает абсолютно нормально. Позиция в .htaccess -- да, но вы уже сказали, что поставили ее на первое место (не могли бы вы обновить пост с текущими позициями, пожалуйста). Как я уже упоминал, я не уверен в путях (то, как этот (/wp-test-2011-06-13/) может повлиять на все это). Посмотрите на комментарий № 5 здесь — можете ли вы выполнить это правило и показать, куда вы будете перенаправлены? - person LazyOne; 20.06.2011
comment
Я пробовал добавлять и удалять расширения каталогов, изменять правила. В значительной степени пробуя различные комбинации переписывания, которые я могу придумать. Большую часть времени я получаю страницу Wordpress не найденную страницу. Я также (в зависимости от того, что я изменил и где) я получаю ошибку сервера 500 или постоянно перемещаемую ошибку 301 от Apache. Вы можете взглянуть на мое последнее обновление. Но я постоянно меняю свой .htaccess, чтобы посмотреть, повезет ли мне. - person user801816; 20.06.2011
comment
Такое правило перезаписи должно быть ДО первого RewriteCond (поскольку эти 3 инструкции говорят Apache перенаправить все неизвестные URL-адреса на index.php). Кроме того, попробуйте RewriteRule без ^ , например. RewriteRule ORLANDO-criminal-defense-attorney/defense-attorney-NEJAME\.html$ /orlando-criminal-defense-attorney/defense-attorney-nejame.htm [QSA,NC,R=301] а также этот вариант: RewriteRule ORLANDO-criminal-defense-attorney/defense-attorney-NEJAME\.html$ /wp-test-2011-06-13/orlando-criminal-defense-attorney/defense-attorney-nejame.htm [QSA,NC,R=301] - person LazyOne; 21.06.2011
comment
Пробовал несколько разных комбинаций. Единственное, что, как мне кажется, может мешать, это то, что у меня есть плагин Wordpress, который размещает .htm во всех сообщениях и страницах. Но RedirectMatch 301 работает, поэтому я не уверен, что может пойти не так. - person user801816; 21.06.2011
comment
Тогда не знаю, извините. Могу только заверить вас, что само правило работает. Я не работал с WordPress напрямую и почти ничего не знаю о плагинах, которые он может иметь, и о том, как они могут повлиять на перенаправление здесь. - person LazyOne; 21.06.2011