301 Перенаправление, чтобы заменить все пробелы на дефисы - PullRequest
6 голосов
/ 28 апреля 2011

Так вот моя проблема. Я завладел сайтом, на котором проиндексированы несколько страниц с индексом% 20 в Google. Это просто потому, что человек решил просто использовать имя тега в качестве заголовка и URL-адреса. Итак, URL были примерно такими:

http://www.test.com/tag/bob%20hope
http://www.test.com/tag/bob%20hope%20is%20funny

Я добавил новое поле для URL-адреса и строка заменила все пробелы тире. Хотя у меня нет проблем со ссылками на эти новые страницы и получением данных, мне нужно 301 перенаправить старые URL-адреса на новые URL-адреса, что будет выглядеть примерно так:

http://www.test.com/tag/bob-hope
http://www.test.com/tag/bob-hope-is-funny

Итак, он должен иметь возможность учитывать несколько пробелов. Любые вопросы? :)

Ответы [ 2 ]

9 голосов
/ 28 апреля 2011

Используйте эти правила в вашем файле .htaccess:

Options +FollowSymlinks -MultiViews
RewriteEngine on
RewriteBase /

# keep replacing space to hyphen until there is no space use internal rewrite
RewriteRule ^([^\s%20]*)[\s%20]+(.*)$ $1-$2 [E=NOSPACE:1]

# when there is no space make an external redirection
RewriteCond %{ENV:NOSPACE} =1
RewriteRule ^([^\s%20]+)$ $1 [R=301,L]

Это заменит все пробелы (\s или %20) на дефис -

Таким образом, URI /tag/bob%20hope%20is%20funny станет /tag/bob-hope-is-funny с 301

Краткое объяснение: Если в URI больше 1 пробела, 1-й RewriteRule запускается рекурсивно, заменяя каждый пробел символом дефиса - до тех пор, пока не останется свободного места. Это правило будет переписано только внутри.

Как только не осталось пробела, запускается 2-й RewriteRule, который просто использует 301 redirect для преобразованного URI.

2 голосов
/ 26 ноября 2015

Опираясь на ответ @ anhubhava, он близок, но он также будет соответствовать%, 2 или 0 в URL, и это может вызвать цикл в apache 2.2, если вы не используете параметр DPI. Полный скрипт должен выглядеть так:

Options FollowSymlinks MultiViews
RewriteEngine on
RewriteBase /

# keep replacing space to hyphen until there is no space use internal rewrite
RewriteRule ^([^\s%20]*)(?:\s|%20)+(.*)$ $1-$2 [N,E=NOSPACE:1,DPI]

# when there is no space make an external redirection
RewriteCond %{ENV:NOSPACE} =1
RewriteRule ^([^\s%20]+)$ $1 [R=301,L]

Я также добавил параметр N (Next), так как это вынуждает правила переоцениваться с самого начала сразу после этого правила, если оно совпадает. Если этого нет, вы можете столкнуться с проблемами, если будете использовать apache в качестве обратного прокси-сервера, поскольку маловероятно, что он дойдет до конца переписывания, прежде чем что-то еще произойдет.

...