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

我当前的站点URL是由电子商务软件根据产品和类别名称自动生成的,因此,如果产品/类别名称包含非字母数字字符,则将其编码在URL中是很麻烦的。例如:

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

我正在使用新的电子商务解决方案,该解决方案还可以从产品名称自动生成URL,但是足够聪明,可以删除所有非字母数字字符。它还可以转换为小写字母,我设法找到了将大写字母重定向到小写字母的htaccess解决方案。它也没有URL的“商店”部分,我也设法通过htaccess来解决。例如:
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。

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

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

任何人都可以为此建议合适的htaccess规则吗?

提前致谢。

最佳答案

在通过重写引擎发送URI之前,已对该URI进行了url解码,因此您要匹配实际字符而不是已编码的对应字符:

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 rewrite知道如果应用了以上任何规则(因此使内部重定向状态值= 200),那么我们需要进行重定向,但是直到清除了所有规则后我们才可以到达规则的那部分。特殊字符检查。

您希望这些规则在所有重定向之前都在之前全部为,以便规则可以循环并删除这些字符中的任何一个的多个实例。然后,一旦不再有特殊字符,重写引擎便可以向下跳转到重定向的位置。

我建议您删除mod_alias RedirectMatch指令并将其替换为重写规则。有时将两个模块组合在一起并使两个模块都影响一个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]

关于apache - 使用htaccess从URL中删除字符,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13818776/

10-11 02:40
查看更多