Htaccess - 将下划线结合到连字符和大写到小写 301 重定向

Posted

技术标签:

【中文标题】Htaccess - 将下划线结合到连字符和大写到小写 301 重定向【英文标题】:Htaccess - Combining underscore to hyphen and uppercase to lowercase 301 redirect 【发布时间】:2015-03-30 21:12:19 【问题描述】:

目前我在我的网站上使用下划线连字符 301,这运行良好,但我还想将所有链接转换为小写,并将大写添加到小写重写。

我可以这样做,但使用当前方法它会执行以下操作,我认为这对 SEO 不是很好:

    原始网址 301 已替换连字符 301 连字符小写 URL

如何将以下重写合并到一个查询中,以便通过 301 将带有下划线或大写的 url 转换为连字符和小写?

下划线改写连字符

RewriteRule ^post/([^_]*)_([^_]*_.*)$ /posts/new-category-1/$1-$2 [L,NE]
RewriteRule ^post/([^_]*)_([^_]*)$ /posts/new-category-1/$1-$2 [L,NE,R=301]

RewriteRule ^forum/([^_]*)_([^_]*_.*)$ /forums/new-category-1/$1-$2 [L,NE]
RewriteRule ^forum/([^_]*)_([^_]*)$ /forums/new-category-1/$1-$2 [L,NE,R=301]

大写到小写重写

httpd.conf

RewriteMap lc int:tolower

.htaccess

RewriteCond %REQUEST_URI ^[^A-Z]*[A-Z].*
RewriteRule ^ $lc:%REQUEST_URI [L,R=301]

【问题讨论】:

【参考方案1】:

您可以通过以下规则避免多个301

RewriteRule ^(post|forum)/([^_]*)_([^_]*_.*)$ /$1/$2-$3 [L,NE]

# if there is any upper case letter then do both lowercase conversion AND
# underscore to hyphen replacement
RewriteCond %REQUEST_URI [A-Z]
RewriteRule ^(post|forum)/([^_]*)_([^_]*)$ /$lc:$1/$lc:$2-$lc:$3 [L,NE,R=301]

# otherwise regular underscore to hyphen replacement
RewriteRule ^(post|forum)/([^_]*)_([^_]*)$ /$1/$2-$3 [L,NE,R=301]

# and regular lower case conversion
RewriteRule ^(post|forum)/[^A-Z]*[A-Z] $lc:%REQUEST_URI [L,R=301]

【讨论】:

目前如果没有下划线,这允许大写字母? 似乎将/profiles/Person 重定向到/profiles/person?最后一行似乎可以在任何 URL 上运行,而不仅仅是匹配的? 是否可以在(post|forum) 上只使用小写字母或在/profiles/name 上不使用小写字母? 刚上线所以错过了你的聊天。我没有在 URI 中添加 /category-1/ 的任何规则。看起来你的其他规则是冲突的。确保在您的 .htaccess 中保留上述规则之后的其他规则,并在新浏览器中进行测试。此外,如果它不能解决,请打开一个新问题,因为从 cmets 部分了解复杂问题并不重要。 原来是我没有把RewriteMap lc int:tolower放到新的vhost conf中

以上是关于Htaccess - 将下划线结合到连字符和大写到小写 301 重定向的主要内容,如果未能解决你的问题,请参考以下文章

.htaccess - 递归地将斜杠映射到下划线(内部重定向)

js对象属性名驼峰式转下划线

.htaccess 结合 301 重定向和 URI 重写

python实现将字符串中以大写字母开头的单词前面添加“_”下划线

将 Java 字符串从全部大写(由下划线分隔的单词)转换为 CamelCase(无单词分隔符)的最简单方法是啥?

Java 驼峰命名转下划线命名(能正确处理连续HTTP等大写)