.htaccess重写冲突规则

时间:2015-02-14 18:52:28

标签: .htaccess mod-rewrite url-rewriting

我遇到了一些htaccess规则的问题,我认为这很简单。我有一些很好的SEO友好URL重写,如下所示

RewriteEngine On
RewriteCond %{REQUEST_URI} !^(index\.php|/images|/templates|/views|/ajax|/uploads|/robots\.txt|/sitemap\.xml|/favicon\.ico|/scripts|/cron|/combine.php|/js|/css)
RewriteRule ^(.*)$ index.php?ref=$1&%{QUERY_STRING} [L]

这一切都很好,我想保留这个。我还希望将Google WMT报告的一些旧页面重写为新的等效标题,并且我想使用:

Redirect 301 /about_us http://example.com/about-us

我遇到的问题是浏览器指向的URL是:

http://example.com/about-us?ref=about_us

about_us是旧链接,about-us是正确的链接。如果htaccess重定向到example.com/about-us,那么另一个SEO友好重写规则将选择它并显示页面但是额外的?ref =参数令人困惑。我猜这两个规则在某种程度上是冲突的,但有没有办法让两个规则一起工作,例如没有额外的重定向?ref =参数?我对htaccess的了解至少是基本的,所以我对这个问题有点困惑。

提前致谢

1 个答案:

答案 0 :(得分:0)

RedirectRedirectMatch是mod_alias的一部分,而重写规则是mod_rewrite的一部分。您遇到的问题是当您混合两者时,两个模块会影响同一个请求,因此当您只想要一个时,会发生两件事。在这种情况下,你需要坚持使用mod_rewrite并改为使用它:

RewriteEngine On

RewriteRule ^about_us /about-us [L,R=301]

RewriteCond %{REQUEST_URI} !^(index\.php|/images|/templates|/views|/ajax|/uploads|/robots\.txt|/sitemap\.xml|/favicon\.ico|/scripts|/cron|/combine.php|/js|/css)
RewriteRule ^(.*)$ index.php?ref=$1&%{QUERY_STRING} [L]

请注意,重定向的规则来自之前路由到index.php的规则。