如何使用 .htaccess RewriteRule 将下划线更改为破折号 [英] How do I use .htaccess RewriteRule to change underscores to dashes

查看:25
本文介绍了如何使用 .htaccess RewriteRule 将下划线更改为破折号的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在开发一个网站,它的 CMS 用于使用下划线字符作为单词分隔符来保存新页面的 url.

I'm working on a site, and its CMS used to save new page urls using the underscore character as a word seperator.

尽管 Google 现在将下划线视为单词分隔符,但 SEO 权力要求该网站改用破折号.

Despite the fact that Google now treats underscore as a word seperator, the SEO powers that be are demanding the site use dashes instead.

这在 CMS 中很容易做到,而且我当然可以更改保存在为 CMS 提供服务的 MySQL 数据库中的所有现有 URL.

This is very easy to do within the CMS, and I can of course change all existing URLs saved in the MySQL database that serves the CMS.

我的问题在于编写一个 .htaccess 规则,该规则将 301 旧样式下划线分隔到新样式连字符版本的链接.

My problem lies in writing a .htaccess rule that will 301 old style underscore seperated links to the new style hyphenated verstion.

我在其他网站上成功使用了这个堆栈溢出问题的答案,使用:

I had success using the answers to this Stack Overflow question on other sites, using:

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

然而,这个 CMS 网站使用了大量现有规则来生成干净的 URL,我无法将其与现有规则集结合使用.

However this CMS site uses a lot of existing rules to produce clean URLs, and I can't get this working in conjunction with the existing rule set.

.htaccess 目前看起来像这样:

.htaccess currently looks like this:

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 种格式之一:

All page URLS are in one of the 3 following formats:

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 技能显然达不到标准.

I'm sure I am missing something obvious, but at this level my regex and mod_rewrite skills clearly aren't up to par.

任何想法将不胜感激!

推荐答案

只需使用您已经使用的规则:

Just take the rule you were using already:

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

...并把它放在所有其他重写规则之前,一切都应该有效.

…and put it before all other rewrite rules, and everything should work.

此外,您使用了 RewriteBase/ 两次.你可以第二次省略它,因为它已经定义了.

Also, you used RewriteBase / twice. You can omit it the second time, since it’s already defined.

这篇关于如何使用 .htaccess RewriteRule 将下划线更改为破折号的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆