【问题标题】:Using htaccess to rewrite special characters for Wordpress url aliases使用 htaccess 重写 Wordpress url 别名的特殊字符
【发布时间】:2012-08-03 15:28:38
【问题描述】:

我最近将一个相当大的网站(约 6,000 个帖子)从 Drupal 迁移到了 Wordpress。作为该过程的一部分,我将 Drupal 创建的 url 别名迁移到 Wordpress 以用于 SEO 和链接保留。

Drupal 创建的在 Drupal 中运行良好的 url 别名示例:

  • /stories/will-this-be-another-la-niña-year

Wordpress 中的那个 url 返回一个 404。但是,这是可行的:

  • /stories/will-this-be-another-la-nina-year

看来我最好的选择是在将 URL 传递给 Wordpress 之前,在 htaccess 中将通用国际字符写入英文字符集重写规则。

知道我该怎么做吗? 非常感谢您提供的任何帮助。 马特。

【问题讨论】:

    标签: wordpress .htaccess drupal redirect special-characters


    【解决方案1】:

    似乎在 wordpress 中可能有更好的方法来做到这一点,您可能想通过wordpress Trac tickets 做一个快速浏览器,可能有一些补丁或临时修复该问题。但是,如果您需要使用 htaccess/redirect 方法,您可以使用 RewriteMap 清理和重定向(如果需要)或显式重定向非 ascii 字符。

    RewriteMap 需要访问服务器或虚拟主机配置来设置映射。它可以像映射到 http://yourdomain.com/stories/will-this-be-another-la-nina-year/stories/will-this-be-another-la-niña-year URI 列表一样简单(所有 ascii URL,http:// 很重要,因为它告诉 mod_rewrite 重定向浏览器)。或者您可以编写一个脚本来查找非 ascii 字符并将其替换为适当的 ascii 字符。

    文本映射:

    RewriteMap sanitize txt:/path/to/uri_mapping.txt
    

    脚本映射:

    RewriteMap sanitize prg:/path/to/sanitize_script.php
    

    然后在您的 htaccess 文件中,您可以像这样调用此映射(这些规则需要高于 wordpress 规则,因为您希望在 wordpress 之前对 URI 进行清理抓住他们。

    RewriteRule ^(.*)$ /${sanitize:$1|$1} [L]
    

    如果您无权访问服务器/虚拟主机配置,则必须在 htaccess 文件中列举可能性,再次将这些规则置于 wordpress 规则之上:

    # replace ñ
    RewriteRule ^(.*)ñ(.*)$ /$1n$2 [R=301,L]
    
    # replace ú
    RewriteRule ^(.*)ú(.*)$ /$1ú$2 [R=301,L]
    

    等等

    【讨论】:

    • 非常感谢@Jon 的回复。您的想法适用于除实际特殊字符之外的所有内容。例如,如果我更改# replace ñ 重写规则以替换“a”而不是“ñ”,它会用“n”s 代替“a”s 重写 url。但是,使用(.*)ñ(.*)$ 并不会重写 URL 中的“ñ”。 RewriteMap 方法的作用相同。您是否认为这可能是服务器配置问题,以及它如何处理国际字符?再次感谢。
    • @MattHarvey 可能正在逃跑。尝试代替ñ,将其替换为转义的网址%C3%B1
    • 它似乎也忽略了这一点。 RewriteRule ^(.*)%C3%B1(.*)$ /$1n$2 [R=301,L] 是我正在使用的。还有其他选择吗?再次感谢。
    • @MattHarvey 不知道该说什么,该规则适用于我在本地全新 apache 安装中的 htaccess 文件中。无论您在其中编辑 htaccess 文件,都可能存在 unicode 问题,但可能是其他问题。
    • 我认为这是我的主机的 unicode 问题。他们正在从头开始做一些改变。非常感谢所有的帮助。
    【解决方案2】:

    我刚刚在 .htaccess 文件的开头添加了以下几行,它可以工作:

    RewriteRule ^(.*)é(.*)$ /$1e$2 [R=301,L]
    RewriteRule ^(.*)è(.*)$ /$1e$2 [R=301,L]
    RewriteRule ^(.*)ê(.*)$ /$1e$2 [R=301,L]
    RewriteRule ^(.*)î(.*)$ /$1i$2 [R=301,L]
    RewriteRule ^(.*)ô(.*)$ /$1o$2 [R=301,L]
    RewriteRule ^(.*)û(.*)$ /$1u$2 [R=301,L]
    RewriteRule ^(.*)â(.*)$ /$1a$2 [R=301,L]
    RewriteRule ^(.*)à(.*)$ /$1a$2 [R=301,L]
    RewriteRule ^(.*)ï(.*)$ /$1i$2 [R=301,L]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-12
      • 2017-08-31
      • 2012-08-20
      • 1970-01-01
      • 2019-01-05
      • 2021-01-14
      • 2013-06-08
      • 2015-09-01
      相关资源
      最近更新 更多