Мод переписать: заменить все _ (подчеркивание) на - (дефис) - PullRequest
0 голосов
/ 21 января 2010

Мне нужно, чтобы все _ (подчеркивания) в каждом URL были заменены на - (дефисы)

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

RewriteRule ^([^_]+)-([^_]+)-([^_]+)-([^_]+)-([^_]+)-([^_]+)-([^.]+)-([^.]+)-([^.]+)-([^.]+)$ index.php?/$1_$2_$3_$4_$5_$6_$7_$8_$10 [L]
RewriteRule ^([^_]+)-([^_]+)-([^_]+)-([^_]+)-([^_]+)-([^_]+)-([^.]+)-([^.]+)-([^.]+)$ index.php?/$1_$2_$3_$4_$5_$6_$7_$8_$9 [L]
RewriteRule ^([^_]+)-([^_]+)-([^_]+)-([^_]+)-([^_]+)-([^_]+)-([^.]+)-([^.]+)$ index.php?/$1_$2_$3_$4_$5_$6_$7_$8 [L]
RewriteRule ^([^_]+)-([^_]+)-([^_]+)-([^_]+)-([^_]+)-([^_]+)-([^.]+)$ index.php?/$1_$2_$3_$4_$5_$6_$7 [L]
RewriteRule ^([^_]+)-([^_]+)-([^_]+)-([^_]+)-([^_]+)-([^.]+)$ index.php?/$1_$2_$3_$4_$5_$6 [L]
RewriteRule ^([^_]+)-([^_]+)-([^_]+)-([^_]+)-([^.]+)$ index.php?/$1_$2_$3_$4_$5 [L]
RewriteRule ^([^_]+)-([^_]+)-([^_]+)-([^.]+)$ index.php?/$1_$2_$3_$4 [L]
RewriteRule ^([^_]+)-([^_]+)-([^.]+)$ index.php?/$1_$2_$3 [L]
RewriteRule ^([^_]+)-([^.]+)$ index.php?/$1_$2 [L]

Спасибо.

Ответы [ 4 ]

3 голосов
/ 21 января 2010

sedhyphen.sh:

#!/bin/sh
sed -u 's/_/-/g'

httpd conf:

RewriteMap sed-hyphen prg:sedhyphen.sh
RewriteRule ^(.*)$ index.php?/${sed-hyphen:$1} [L]

Убедитесь, что sedhyphen.sh установлен как исполняемый.

1 голос
/ 27 февраля 2013

Я знаю, что это старый вопрос, но вот мое решение. Он не тратит ресурсы, оптимизирован для SEO и не требует использования bash, вместо этого полагаясь на php.

Поместите это в ваш .htaccess после запуска механизма перезаписи

RewriteCond %{REQUEST_URI} (.*)_(.*)
RewriteRule (.*)$ /tools/underscore_to_hyphen.php?rewrite_uri=$1 [NC,L]

Это отправит все файлы сценария php underscore_to_hyphen.php, в который вы поместили этот код:

<?php
$path = $_GET['unchanged_path'];
$input_uri = $_GET['rewrite_uri'];

$output_uri = str_replace("_", "-", $input_uri);

//For redirect uncoment:
header("HTTP/1.1 301 Moved Permanently");
header("Location: $path$output_uri");
exit();

//For rewrite uncoment:
//include_once "$_SERVER[DOCUMENT_ROOT]$path$output_uri";
?>

Который отправит его в нужное место.

Поскольку это правило перезаписи без перенаправления в .htaccess, оно приведет к одному перенаправлению или перезаписи для пользователя / паука.

Обратите внимание, что это только частично проверено, и я использовал его в обратном порядке, чтобы изменить - на _.

0 голосов
/ 21 января 2010

Возможно, это:

RewriteCond %{REQUEST_URI} ^(.*)_(.*)/$
RewriteRule (.*)_(.*)/ http://your-site.com$1-$2/ [R=301]
0 голосов
/ 21 января 2010

mod_rewrite не является хорошим инструментом для такой работы. Почему бы вам не заменить на PHP?

$_SERVER['QUERY_STRING'] = str_replace('_', '-', $_SERVER['QUERY_STRING']);

Редактировать Хорошо, вы можете попробовать следующие наборы правил:

# using the path
RewriteRule ^([^-]+)-([^-]+-.+) /$1_$2 [N]
RewriteRule ^([^-]+)-(.+) index.php?/$1_$2 [L]

# using the query
RewriteRule ^([^-]+)-(.+) index.php?/$1_$2
RewriteCond %{QUERY_STRING} ^([^-]+)-(.+)
RewriteRule ^index\.php$ ?$1_$2 [N]
RewriteRule ^index\.php$ - [L]

Но будьте осторожны с флагом N , так как вы можете легко получить бесконечную рекурсию.

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