使用htaccess从URL中删除字符

时间:2012-12-11 10:54:59

标签: apache .htaccess redirect character strip

希望有人能看到我做错了什么,但这就是故事......

我的当前网站网址是由电子商务软件从产品和类别名称自动生成的,因此,如果产品/类别名称包含非字母数字字符,则会在URL中编码,这很痛苦。 EG:

mysite.com/Shop/Furniture-Set-Large-Table%2C-4-Chairs.html

我正在转向新的电子商务解决方案,该解决方案还会从产品名称自动生成网址,但是足够聪明,可以删除所有非字母数字字符。它也转换为小写,我已经设法找到一个htaccess解决方案,用于将大写重定向到小写。它也没有URL的“Shop”部分,我也通过htaccess设法解决了这个问题。 EG:

mysite.com/furniture-set-large-table-4-chairs.html

要删除“商店”部分:

RedirectMatch 301 ^/Shop/(.*)$ http://www.mysite.com/$1

用小写替换大写以防止404错误:

RewriteCond %{REQUEST_URI} [A-Z]
RewriteCond %{REQUEST_FILENAME} !\.(?:png|gif|ico|swf|jpg|jpeg|js|css|php|pdf)$
RewriteRule (.*) ${lc:http://www.mysite.com/$1} [R=301,L]

这两者都很完美。

所以我需要一个htaccess规则,或者可能是几个,从URL中删除这些编码字符。我不需要替换它们,只需删除它们,因为软件会将URL创建为“Table%2C-4-Chairs” - 因此只需删除%2C。

我需要从网址中删除某些字符编码,例如:

逗号(%2C),撇号(%27),冒号(%3A)等。

有人可以为此建议合适的htaccess规则或规则吗?

提前致谢。

1 个答案:

答案 0 :(得分:4)

URI在通过重写引擎发送之前进行了网址解码,因此您希望匹配实际字符而不是其编码对应项:

RewriteRule ^(.*),(.*)$ /$1$2 [L]
RewriteRule ^(.*):(.*)$ /$1$2 [L]
RewriteRule ^(.*)\'(.*)$ /$1$2 [L]
RewriteRule ^(.*)\"(.*)$ /$1$2 [L]
# etc...

RewriteCond %{ENV:REDIRECT_STATUS} 200
RewriteRule ^(.*)$ http://www.mysite.com/$1 [L,R=301]

重定向状态允许mod重写知道如果上述任何规则被应用(从而使内部重定向状态值= 200),那么我们需要重定向,但是在它被清除之前我们不会达到规则的那部分所有特殊字符检查。

您希望这些规则全部之前任何重定向,以便规则可以循环并删除任何这些字符的多个实例。然后,一旦没有更多特殊字符,重写引擎就可以逐渐显示到重定向的位置。

我建议您删除mod_alias RedirectMatch指令并将其替换为重写规则。有时组合2个模块并使它们都影响单个URI可能会导致意外结果。所以之前所有上述规则,你都有:

RewriteRule ^Shop/(.*)$ /$1 [L]

在特殊字符链中添加/Shop/的删除。然后你的最后一条规则将遵循:

RewriteCond %{REQUEST_URI} [A-Z]
RewriteCond %{REQUEST_FILENAME} !\.(?:png|gif|ico|swf|jpg|jpeg|js|css|php|pdf)$
RewriteRule (.*) ${lc:http://www.mysite.com/$1} [R=301,L]