Apache 301重定向原始URL包含特殊字符的位置

时间:2015-05-15 16:42:45

标签: wordpress apache .htaccess mod-rewrite redirect

我正在寻找一些.htaccess 重定向 RewriteRule 帮助。

我的客户有一个网站,该网站使用格式不正确的网址,Google网页工具将其报告为404错误,例如:

/calendar-of-events/wanda-hollberg’s-fused-glass-jewelry-trunk-show/

注意不好的撇号,“'”字符?

这是另一个例子:

/dining club.cfm

注意空格,“”?

又一个例子:

/calendar-of-events/“a-viticultural-voyage”-wine-dinnerstar/

注意不好的引号,“”和“”“?”

我尝试过重定向规则但没有成功,例如UTF-8编码......

Redirect 301 /calendar-of-events/wanda-hollberg%E2%80%99s-fused-glass-jewelry-trunk-show/ /calendar-of-events/
Redirect 301 /dining%20club.cfm /cuisine/
Redirect 301 /calendar-of-events/%E2%80%9Ca-viticultural-voyage%E2%80%9D-wine-dinnerstar/ /calendar-of-events/

以及尝试使用RegExp ......

Redirect 301 /calendar-of-events/wanda-hollberg(.*)s-fused-glass-jewelry-trunk-show/ /calendar-of-events/
Redirect 301 /dining(.*)club.cfm /cuisine/
Redirect 301 /calendar-of-events/(.*)a-viticultural-voyage(.*)-wine-dinnerstar/ /calendar-of-events/

但我猜RegExp在重定向中不起作用?!

所以我尝试了 RewriteRule ,但仍然没有成功......

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule (.*)/calendar-of-events/wanda-hollberg(.*)s-fused-glass-jewelry-trunk-show/$ /calendar-of-events/ [R=301,L]
</IfModule>

请告知,我错过了什么或做错了什么?

我应该使用重定向还是 RewriteRule ?我应该如何写出规则?

我还应该注意,这个现在在WordPress网站上,因此.htaccess文件也有......

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /

# redirect none-www to www
RewriteCond %{HTTP_HOST} ^domain\.com$
RewriteRule (.*) http://www.domain.com/$1 [R=301,L]

# redirect m. to www
RewriteCond %{HTTP_HOST} ^m\.domain\.com$
RewriteRule (.*) http://www.domain.com/$1 [R=301,L]

# redirect legacy. to www
RewriteCond %{HTTP_HOST} ^legacy\.domain\.com
RewriteRule (.*) http://www.domain.com/$1 [R=301,L]

</IfModule>

非常感谢您的建议和努力。欢呼声。

1 个答案:

答案 0 :(得分:2)

你需要摆脱规则中的主要斜线。如果您要匹配/calendar的请求,则正则表达式需要以^calendar开头,而不使用前导斜杠。当匹配htaccess文件中的规则时,mod_rewrite会删除斜杠。

就像Justin Iurman提到的那样,你所有的重定向必须在wordpress路由规则之前。规则的顺序非常重要,路由规则吞噬了所有请求,因此会使重定向中断。

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /

# redirect none-www to www
RewriteCond %{HTTP_HOST} ^domain\.com$
RewriteRule (.*) http://www.domain.com/$1 [R=301,L]

# redirect m. to www
RewriteCond %{HTTP_HOST} ^m\.domain\.com$
RewriteRule (.*) http://www.domain.com/$1 [R=301,L]

# redirect legacy. to www
RewriteCond %{HTTP_HOST} ^legacy\.domain\.com
RewriteRule (.*) http://www.domain.com/$1 [R=301,L]

RewriteRule ^calendar-of-events/wanda-hollberg`s-fused-glass-jewelry-trunk-show/$ /calendar-of-events/ [R=301,L]
RewriteRule ^dining\ club.cfm /cuisine/ [R=301,L]
RewriteRule ^calendar-of-events/\“a-viticultural-voyage\”-wine-dinnerstar/ /calendar-of-events/ [R=301,L]
</IfModule>

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

转义序列在mod_rewrite处理URI之前未转义,因此您希望在正则表达式中添加实际的非转义字符。或者您可以使用\x##,例如:

RewriteRule ^calendar-of-events/\xE2\x80\x9Ca-viticultural-voyage\E2\x80\x9D-wine-dinnerstar/ /calendar-of-events/ [R=301,L]

(.*)分组在Redirect中无效的原因是因为该指令不使用正则表达式。您必须使用RedirectMatch。但是你想要坚持使用mod_rewrite。由于你有wordpress规则,mod重写和mod别名最终都会应用于相同的请求,最终会破坏你的重定向。