Как мне использовать .htaccess RewriteRule, чтобы изменить подчеркивание на тире - PullRequest
3 голосов
/ 14 апреля 2010

Я работаю над сайтом, и его CMS используется для сохранения URL-адресов новых страниц с использованием символа подчеркивания в качестве разделителя слов.

Несмотря на то, что Google теперь рассматривает подчеркивание как разделитель слов, возможности SEO требуют, чтобы сайт использовал тире.

Это очень легко сделать в CMS, и я, конечно, могу изменить все существующие URL-адреса, сохраненные в базе данных MySQL, которая обслуживает CMS.

Моя проблема заключается в написании правила .htaccess, которое будет подчеркивать разделенные ссылки 301 старого стиля на дефис в новом стиле.

Мне удалось использовать ответы на этот вопрос переполнения стека на других сайтах, используя:

RewriteRule ^([^_]*)_([^_]*_.*) $1-$2 [N]
RewriteRule ^([^_]*)_([^_]*)$ /$1-$2 [L,R=301]

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

.htaccess в настоящее время выглядит так:

Options FollowSymLinks
# RewriteOptions MaxRedirects=50

RewriteEngine On
RewriteBase /

RewriteCond %{HTTP_HOST} !^www\.mydomain\.co\.uk$ [NC]
RewriteRule (.*) http://www.mydomain.co.uk/$1 [R=301,L]

#trailing slash enforcement
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !#
RewriteCond %{REQUEST_URI} !(.*)/$
RewriteRule ^(.*)$ http://www.mydomain.co.uk/$1/ [L,R=301]

RewriteRule ^test/([0-9]+)(/)?$ test_htaccess.php?year=$1 [nc]

RewriteRule ^index(/)?$ index.php

RewriteRule ^department/([^/]*)/([^/]*)/([^/]*)(/)?$ ecom/index.php?action=ecom.details&mode=$1&$2=$3 [nc]
RewriteRule ^department/([^/]*)(/)?$                 ecom/index.php?action=ecom.details&mode=$1 [nc]

RewriteRule ^product/([^/]*)/([^/]*)/([^/]*)(/)?$ ecom/index.php?action=ecom.pdetails&mode=$1&$2=$3 [nc]
RewriteRule ^product/([^/]*)(/)?$                 ecom/index.php?action=ecom.pdetails&mode=$1 [nc]
RewriteRule ^content/([^/]*)(/)?$                 ecom/index.php?action=ecom.cdetails&mode=$1 [nc]

RewriteRule ([^/]*)/action/([^/]*)/([^/]*)/([^/]*)/([^/]*)(/)?$ $1/index.php?action=$2&mode=$3&$4=$5 [nc]
RewriteRule ([^/]*)/action/([^/]*)/([^/]*)(/)?$                 $1/index.php?action=$2&mode=$3 [nc]
RewriteRule ([^/]*)/action/([^/]*)(/)?$                         $1/index.php?action=$2 [nc]
RewriteRule ^eaction/([^/]*)/([^/]*)/([^/]*)/([^/]*)(/)?$       ecom/index.php?action=$1&mode=$2&$3=$4 [nc]
RewriteRule ^eaction/([^/]*)/([^/]*)(/)?$                       ecom/index.php?action=$1&mode=$2 [nc]
RewriteRule ^action/([^/]*)/([^/]*)(/)?$                        index.php?action=$1&mode=$2 [nc]
RewriteRule ^sid/([^/]*)(/)?$                                   index.php?sid=$1 [nc]




## Error Handling ##
#RewriteRule ^error/([^/]*)(/)?$ index.php?action=error&mode=$1 [nc]

# ----------------------------------- Content Section ------------------------------ #
#RewriteRule ^([^/]*)(/)?$ index.php?action=cms&mode=$1 [nc]

RewriteRule ^accessibility(/)?$ index.php?action=cms&mode=accessibility
RewriteRule ^terms(/)?$         index.php?action=cms&mode=conditions
RewriteRule ^privacy(/)?$       index.php?action=cms&mode=privacy
RewriteRule ^memberpoints(/)?$  index.php?action=cms&mode=member_points

RewriteRule ^contactus(/)?$ index.php?action=contactus
RewriteRule ^sitemap(/)?$   index.php?action=sitemap

ErrorDocument 404 /index.php?action=error&mode=content

ExpiresDefault "access plus 3 days"

Все URL-адреса страниц имеют один из 3 следующих форматов:

http://www.mydomain.com/department/some_page_address/

http://www.mydomain.com/product/some_page_address/

http://www.mydomain.com/content/some_page_address/

Я уверен, что упускаю что-то очевидное, но на этом уровне мои навыки регулярных выражений и mod_rewrite явно не на должном уровне.

Любые идеи будут с благодарностью!

1 Ответ

3 голосов
/ 14 апреля 2010

Просто возьмите правило, которое вы уже использовали:

RewriteRule ^([^_]*)_([^_]*_.*) $1-$2 [N]
RewriteRule ^([^_]*)_([^_]*)$ /$1-$2 [L,R=301]

… и поставьте перед всеми другими правилами перезаписи, и все должно работать.

Кроме того, вы использовали RewriteBase / дважды. Вы можете опустить его во второй раз, так как он уже определен.

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