Помогите с условным оператором mod_rewrite - PullRequest
0 голосов
/ 02 августа 2011

Я обновил оптимизированные для SEO URL-адреса своего сайта и отправил в Google новую карту сайта.Проблема в том, что меня, похоже, наказывают в рейтинге за то, что мой старый контент все еще отображается под старым URL, а также новым URL (тот, что на карте сайта).Я пытался выяснить, как перехватить переменные с помощью регулярных выражений, чтобы сделать следующую работу, но, похоже, не могу сделать это правильно.

Есть идеи?У нас есть автомобильные объявления, на которые повлияло обновление для панды / фермера.

Old URL:  http://www.mysite.com/forsale/light-trucks/12345/2010-dodge-ram-1500.html

New URL:  http://www.mysite.com/cars-trucks-for-sale/light-trucks/2010/dodge/ram-1500/12345/2010-dodge-ram-1500.html

В настоящий момент любой из этих URL будет работать (они переписываются в сценарий: showcontent.php?id=12345).

Это означает дублированный контент, так как Google все еще знает о моем старом URL, и все карты моего сайта показывают только новый URL ...

Мне нужно показать перенаправление 301 и убедиться, что мой старый контент переписанв новый формат на лету, но обратите внимание, что у меня есть некоторые НОВЫЕ параметры URL, которых нет в старом URL ...

RewriteRule ^/?(forsale)/([-a-zA-Z0-9_-]+)/([0-9]+)/([-a-zA-Z0-9_-]+)\.html$ showcontent.php?id=$3 [L]

RewriteRule ^/?(cars-trucks-for-sale)/([-a-zA-Z0-9_-]+)/([0-9]+)/([-a-zA-Z0-9_-]+)/([-a-zA-Z0-9_-]+)/([0-9]+)/([-a-zA-Z0-9_-]+)\.html$ showcontent.php?id=$6 [L]

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

1 Ответ

0 голосов
/ 02 августа 2011

Как я понимаю content-type и new-content-type являются постоянными значениями, и это ЕДИНСТВЕННАЯ разница между старым и новым URL.

Если это так - есть несколько способов сделать это:

1. Использование mod_rewrite (вы просили об этом - поместите эти строки в .htaccess в корневой папке веб-сайта. Если их поместить в другом месте, потребуется некоторая настройка):

Options +FollowSymLinks -MultiViews

RewriteEngine On
RewriteBase /

RewriteRule ^content-type/([^/]+)/(\d+)/([^/]+\.html)$ http://www.mysite.com/new-content-type/$1/$2/$3 [R=301,L]

Ну что ж - поскольку URL-адреса очень похожи (на основе предоставленных вами примеров и описания) - вы можете пойти еще более простым путем ( ПРИМЕЧАНИЕ: это перенаправит ЛЮБЫЕ URL-адреса в /content-type/ Папка. Если ваша цель состоит в том, чтобы перенаправлять только URL-адреса с окончанием .html, соответствующие этой структуре, не используйте ее):

RewriteRule ^content-type/(.+)$ http://www.mysite.com/new-content-type/$1 [R=301,L]

2. Не используется mod_rewrite - структура URL старых и новых URL очень похожа .. поэтому даже это будет работать (см. ПРИМЕЧАНИЕ выше):

Redirect 301 /content-type/ http://www.mysite.com/new-content-type/

Это перенаправит (301 постоянное перенаправление) все запросы на URL, начинающийся с /content-type/, точно таким же, но с /new-content-type/ вместо.


ОБНОВЛЕНИЕ: более реальные URL предоставлены OP

Поскольку ваши РЕАЛЬНЫЕ URL-адреса сильно отличаются от старых, не существует действительно хорошего способа написать правило перезаписи одной строки для этого. Поэтому я вижу 2 основных варианта:

1. Создать правило перенаправления для КАЖДОГО старого URL (поместите его где-нибудь в верхней части .htaccess, желательно в конфигурации сервера, если это возможно):

Redirect 301 /forsale/light-trucks/12345/2010-dodge-ram-1500.html http://www.mysite.com/cars-trucks-for-sale/light-trucks/2010/dodge/ram-1500/12345/2010-dodge-ram-1500.html

Если у вас есть тонны таких старых URL-адресов .., тогда этот подход не очень хорош - слишком много URL-адресов для тестирования по каждому отдельному запросу + стоимость обслуживания (создайте эти правила перенаправления).

2. Продолжайте использовать существующие правила перенаправления, которые у вас есть (те, что переписывают на showcontent.php?id=12345). В этом файле showcontent.php создайте правильный URL-адрес (как и должно быть на веб-сайте) и сравните его с запрашиваемым URL-адресом (возьмите его из $_SERVER['REQUEST_URI']). Если URL-адреса отличаются, введите 301 redirect для правильного URL-адреса (используя функцию header()). - Так работает ЭТОТ веб-сайт, например . Это может быть немного медленнее, чем .htaccess (поскольку PHP должен сработать) ... но НАМНОГО проще в реализации и обслуживании (практически нулевая стоимость обслуживания).

...