我正在寻找一些.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>
非常感谢您的建议和努力。欢呼声。
答案 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别名最终都会应用于相同的请求,最终会破坏你的重定向。