Необходимо заменить неизвестное количество пробелов в URL тире - PullRequest
0 голосов
/ 18 октября 2011

Необходимо проверить ряд пробелов и преобразовать их в тире в htaccess.Есть несколько разных плохих URL, которые я перенаправляю, и в настоящее время они работают нормально, если тег - это одно слово ... если есть пробел, 404 с / word1% 20word2, когда это должно быть /word1-word2.

Теперь ... это сказало - не всегда только один пробел ... иногда есть 2, но может быть до 6, насколько я вижу в конфликтах инструментов G.webmaster.

Мой текущийпереписать, который работает для последовательностей URL ниже.

RewriteRule ^.+\(offset\)/+.*?/\(tag\)/([^.]+)$ /tag/$1 [R=301,L]

работает для: www.domain.com/index.php/Blog/(offset)/48/(tag)/word1

работает для: www.domain.com/Blog/(offset)/328/(tag)/word1

работает для: www.domain.com/Tags/(offset)/24/(tag)/word1

не работает для: www.domain.com/index.php/Blog/(offset)/48/(tag)/word1%20word2%20word3

не работает для: www.domain.com / Блог / (смещение) / 328 / (тег) / word1% 20word2

не работает для: www.domain.com/Tags/(offset)/24/(tag)/word1% 20word2

SOO ... Я вне себя, пытаюсь выяснить, как захватить неизвестногоn набор пробелов и замените их тире.Halp!

Ответы [ 2 ]

0 голосов
/ 19 октября 2011

хорошо ... похоже, что код здесь работает. 301 Перенаправление, чтобы заменить все пробелы на дефисы

RewriteCond %{THE_REQUEST} (\s|%20)
RewriteRule ^([^\s%20]+)(?:\s|%20)+([^\s%20]+)((?:\s|%20)+.*)$ $1-$2$3 [N,DPI]
RewriteRule ^([^\s%20]+)(?:\s|%20)+(.*)$ /$1-$2 [L,R=301,DPI]

У меня есть это правило ПОСЛЕ моего оригинального, и, похоже, оно работает нормально.Надеюсь, это поможет кому-нибудь разобраться в проблеме тоже.:)

0 голосов
/ 18 октября 2011

Я не совсем уверен, возможно ли сопоставить неизвестное количество пробелов и заменить их, просто используя mod_rewrite.

Так что одним из решений было бы внутреннее перенаправление (без R) напростой PHP, передайте разделенное пробелами значение в качестве параметра в сценарий PHP, выполните необходимые замены в коде PHP и затем разрешите PHP отправить внешнее перенаправление на исправленный URL-адрес (установив заголовок Location: / new-url), aаналогичный подход описан здесь .

Если вы все равно ищете чистое решение .htaccess / mod_rewrite, то вы можете начать с этого:

RewriteRule ^temprewrite/([\S]+)$ /tag/$1  [R=301,L]
RewriteRule ^temprewrite/(.*?)\s(.*) /temprewrite/$1-$2
RewriteRule ^.+\(offset\)/\d+/\(tag\)/(.*) /temprewrite/$1
  • Третья строка выполняет предварительную обработку, извлекая тег, разделенный пробелами.Он переписывается внутри и будет соответствовать как первому, так и второму правилу.
  • Первое правило выполняет окончательное перенаправление, если больше не найдено пробелов, соответствующих [\S]+.
  • Второе правилоразбивает временное значение на две части, разделенные первым пробелом \s, объединяет части с - и передает результат обратно в механизм перезаписи, где либо первое, либо второе правило будут совпадать снова.

Обратите внимание, что этот «код» не полностью протестирован и может пропустить некоторые редкие случаи и / или привести к множественным внутренним перезаписям, но я думаю, что он «работает достаточно хорошо», чтобы попробовать.

...