Я хотел бы перенаправить любой запрос, который содержит символы подчеркивания на тот же URL, но с дефисами, заменяющими URL-адреса. Я видел много форумов, предлагающих сделать что-то вроде этого:
(Повторите увеличенную версию этого rewriteRule до gazillion)
rewriteRule ^([^_]*)_([^_]*)_([^_]*)_(.*)$ http://example.com/$1-$2-$3-$4 [R=301,L] rewriteRule ^([^_]*)_([^_]*)_(.*)$ http://example.com/$1-$2-$3 [R=301,L] rewriteRule ^([^_]*)_(.*)$ http://example.com/$1-$2 [R=301,L]
Мое текущее решение в php (отлично работает):
if(preg_match('/[_]+/', $_SERVER['REQUEST_URI'])){ $redirectUrl = preg_replace('/[_]+/','-', $_SERVER['REQUEST_URI']); header('Location: '. $redirectUrl , TRUE, 301); return; }
Но я бы предпочел не использовать php и вместо этого хранить его в файле htaccess, не повторяя этот первый rewriteRule снова и снова, чтобы предвидеть, сколько подчеркиваний будет отображаться каждый URL-адрес. Мысли? Есть ли такой способ сделать это, не повторяя приращение rewriteRule?
—– редактировать —–
Мой текущий файл htaccess – это только стандартный 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>
См. Флаг «Next» / rewrite, который заставляет переопределять набор правил, начиная с первого правила: http://httpd.apache.org/docs/current/rewrite/flags.html#flag_n
Что-то вроде этого может работать:
RewriteRule (.*)_(.*) $1-$2 [N]
Как насчет объединения 2. Имеет одно правило перезаписи, которое переписывает скрипт PHP, который выполняет подстановку и перенаправление. Таким образом, вы избегаете наличия нескольких правил перезаписи, можете обрабатывать любое количество символов подчеркивания и только вызывать перенаправление PHP, когда это необходимо.