.htaccess мод-переписать регулярное выражение Apache путаница приводит к 10k 404 в день - PullRequest
2 голосов
/ 23 декабря 2011

Я просмотрел много вопросов, опубликованных здесь, связанных с .htaccess, apache, mod-rewrite и regex, но я просто не понимаю.Я пробовал несколько разных вещей, но я либо слишком усложняю, либо совершаю ошибки новичка.Несмотря на это, я занимался этим уже несколько дней и полностью разбирал вещи где-то, как показывают 10000 404 в день.

Мой сайт

У меня естьСайт WordPress, который содержит более 23 000 постов, разбитых на чуть более 1200 категорий.Сайт содержит потоковые видеофайлы, новости отрасли, обзоры шоу, фильмы, форумы phpbb и т. Д. И имеет следующую структуру:

  • сайт / базовые категории (0 и az) / подкатегории (название серии) / posts (имя эпизода .html) для всех эпизодов потокового медиа
  • site / movies / post title.html для всех потоковых фильмов
  • site / news / posttitle.html
  • site / reviews / posttitle.html
  • site / page.html для разных страниц
  • site / forums

Структура постоянной ссылки /%category%/%postname%.html

Я использую плагин Yoast Wordpress SEO и у меня есть возможность добавить косую черту для каталогов и категорий.

- это текущая .htaccess

    # BEGIN WordPress
    <IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    RewriteRule ^index\.php$ - [L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /index.php [L]
    </IfModule>

    # END WordPress

Мои примеры

Из нашей старой структуры сайта у нас есть много входящих ссылок, использующих "/ episode title /".Это не верно.Нам нужно, чтобы эти входящие ссылки перенаправляли на / watch-anime / letter, number or symbol only длиной 1 символ / название серии / title эпизода. Html

/one-piece-episode-528​/

должно быть

/watch-anime/o/one-piece/​one-piece-episode-528​.html

Ошибка, которую я допустил, вызвала эту проблему ... "/watch-anime/letter/series title/episode title/" до "/watch-anime/letter/series title/episode title.html".Итак, нам нужно удалить косую черту из отдельных сообщений и добавить .html

/watch-anime​/w​/welcome-to-the-nhk​/welcome-to-the-nhk-episode-14​/

должно быть

/watch-anime​/w​/welcome-to-the-nhk​/welcome-to-the-nhk-episode-14​.html

Та же ошибка вызвала эту проблему в сочетании со старой структурой сайта... "/episode title.html" должно быть "/watch-anime/letter/series title/episode title.html"

/one-piece-episode-528​.html

должно быть

/watch-anime/o/one-piece/​one-piece-episode-528​.html

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

Спасибо за любую помощь, которую вы можете оказать!

1 Ответ

2 голосов
/ 23 декабря 2011

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

Создайте RewriteMap файл.См. здесь для получения дополнительной информации .Это очень простой текстовый файл с: сначала неправильным URL без '/' , затем один пробел (как минимум), а затем правильный URL-адрес, например:

one-piece-episode-528​ /watch-anime/o/one-piece/​one-piece-episode-528​.html
dexter-season-6-episode-1 /watch-interesting-stuff/d/dexter/dexter-season-6-episode-1.html
breaking-bad-full-season-3 /watch-interesting-stuff/b/breaking-bad/​breaking-bad-full-season-3.html

и т. Д.

преобразование этого простого текстового файла в хэш-карту.Например:

httxt2dbm -i mapanime.txt -o mapanime.map

Теперь объявите это в своем vhost:

RewriteMap mapanime \
    dbm:/pathtofile/mapanime.map

Так что в целом ваш vhost должен выглядеть так:

<VirtualHost *>
    RewriteEngine On
    RewriteMap mapanime \
        dbm:/pathtofile/mapanime.map
    # don't touch the URL, but try to search if it exists in mapanime
    RewriteRule /([^/]*)/$ - [QSA,NC,E=VARANIME:${mapanime:$1|notfound}]
    # if VARANIME not empty *and*
    #   VARANIME different from "notfound":
    RewriteCond %{ENV:VARANIME} ^(notfound|)$
    # then redirect it to the right URL:
    # QSA = query string append
    # R = redirect, 301 = definitive redirect
    # L = last = don't go further
    RewriteRule . %{ENV:VARANIME} [QSA,R=301,L]
</VirtualHost>

Надеюсь, это поможет.

Я не вижу более простого решения, но я почти уверен, что это сработает.

Если это не сработает: прочитайте мои обычные "две подсказки" и добавьтежурнал переписывания в вашем вопросе.

Два совета:

Пожалуйста, попробуйте использовать директиву RewriteLog: она поможет вам отследить такие проблемы:

# Trace:
# (!) file gets big quickly, remove in prod environments:
RewriteLog "/web/logs/mywebsite.rewrite.log"
RewriteLogLevel 9
RewriteEngine On

Мой любимый инструмент для проверки регулярных выражений:

http://www.quanetic.com/Regex (не забудьте выбрать ereg (POSIX) вместо preg (PCRE)!)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...