2013-07-31 10 views
0

Я пытаюсь обновить мой .htaccess-файл с целью, чтобы все страницы, которые ответили бы «404-файл не найден», были переписаны на другой URL-адрес.RewriteRule только для определенного шаблона, если произошла ошибка 404

Пример: У меня есть эти 3 ссылки:

: domain.com/category1/123-article-name.html

работы: domain.com/static- Главный/10-путь к уничтожить-ваш-webpage.html

нетронутого: domain.com/simple-website.html

В этом случае первая ссылка должна быть перенаправлена ​​на . Domain.com/lost/123-article-name.html, второй работает allready. Мое правило не должно влиять на третью ссылку.

Надеюсь, вы, ребята, можете мне помочь. Для меня это очень твердый ореол! Спасибо!

EDIT:

RewriteRule ^(.*)/([0-9]+)-(.+).html$ lost/$2-$3.html [L] 

Это то, что у меня до сих пор, но это правило вроде «глупый», потому что он не испытывает Wheater запрашиваемая страница существует или нет.

+0

эта страница существует? 'domain.com/lost/123-article-name.html' (с тире в' article-name' вместо подчеркивания)? – Mash

+0

Извините, моя вина. Часть после «категории» или «каталога» точно такая же, когда переписывается. – Felix

+0

Можете ли вы подробнее рассказать о том, что происходит со ссылкой 'domain.com/category1/123-article-name.html', потому что она должна правильно переписываться. – miah

ответ

0

Ваше правило и правила для CMS являются взаимоисключающими.

Строка 41 (ваше правило) будет выполняться только в том случае, если файл существует, потому что, если файл не существует (переписатьCond в строках 38 и 39), то сервер пытается вернуть index.php?page=path_name, который будет генерировать ошибку 404.

Если вы знаете имена категорий/каталогов, которые отсутствуют, для строк от 10 до 35, вы можете применить свое правило к URL-адресам, в которых они есть.

RewriteRule ^(Ausbildung|Ausland|Berufswelt)/(?=.+-)(.+).html$ lost/$2.html 

Оригинал ответ

Вы можете проверить, чтобы увидеть, если файл существует путь добавления условия перепишет

RewriteCond %{REQUEST_FILENAME} !-f # True if the request isn't a file 
RewriteCond %{REQUEST_FILENAME} !-d # True if the request isn't a directory 
RewriteRule ^.*/([0-9]+)-(.+).html$ lost/$2-$3.html [L] 
#not I removed the first capture group because it is unnecessary. 

примечания стороны: В вашем примере, потому что + является жадным в регулярном выражении, захваченные группы для domain.com/category1/123-article-name.html

  • 123-статья
  • имя

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

RewriteRule ^.*/(?=.+-)(.+).html$ lost/$1.html 

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

Вы должны проверить это htaccess test, это потрясающе!

+0

Это работает, но также перенаправляет (динамически сгенерированные) страницы, имеющие тот же шаблон, что и статья-страница. Я думаю, потому что он генерируется «по запросу», «-f» и «-d» не работает. – Felix

+0

Вы правы! Создает ли ваша CMS страницу 404? – miah

+0

Если я удалю мой выше опубликованный RewriteRule, да. – Felix