2012-08-29 31 views
0

我想重定向域名上的旧asp页面,以便它们链接到CakePHP版本(使用1.3)上各自的页面。域名是一样的。这些重定向正在添加,因此搜索引擎中的结果会转到新的Cake页面。CakePHP 301重定向附加额外的查询字符串参数

我在/.htaccess文件中有一堆重定向301(app/.htaccess和app/webroot/.htaccess是默认的)。

<IfModule mod_rewrite.c> 
    RewriteEngine on 
    RewriteRule ^$ app/webroot/ [L] 
    RewriteRule (.*) app/webroot/$1 [L] 

    Redirect 301 /contacts.asp http://domain/contacts 
    Redirect 301 /users.asp http://domain/users 
</IfModule> 

但由于某些原因,当我去到任何URL的测试重定向,它附加一个额外的查询字符串参数。例如:

要:http://domain/contacts.asp结果http://domain/contacts?url=contacts.asp

所以重定向工作,但它被追加url查询字符串参数。我不想完全删除所有的查询字符串参数,因为一些旧的ASP链接具有查询字符串参数,我也想传递给相应的Cake页面。

我相信“URL”查询字符串参数从app/webroot/.htaccess文件来所见:

<IfModule mod_rewrite.c> 
    RewriteEngine On 
    RewriteCond %{REQUEST_FILENAME} !-d 
    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteRule ^(.*)$ index.php?url=$1 [QSA,L] 
</IfModule> 

需要注意的是,当我把我的301重定向到我的虚拟主机文件,该url参数不附加。我想保留所有这些重定向到我的.htaccess文件中。我怎样才能防止这个url查询字符串参数被追加?

回答

1

这看起来像是一个mod_rewrite和mod_alias跨越彼此的情况。当应用Redirect指令时,URI处理管道不会结束,它将继续通过管道,并且mod_rewrite完成它的工作。不幸的是,最终的结果并不总是你想要的。你可以坚持使用mod_rewrite并删除Redirect指令。

可以删除2个Redirect指令并添加这些2 RewriteRule小号上述该请求映射到app/webroot的那些:您的答复

RewriteRule ^contacts\.asp$ http://domain/contacts [L,R=301] 
RewriteRule ^users\.asp$ http://domain/users [L,R=301] 
+0

谢谢。我想我明白你在说什么。将'重写规则^联系人\ .asp $ http:// domain/contacts [L,R = 301]'保持参数完好?例如,将http://domain/contacts.asp?contact = x重定向到http:// domain/contacts?contact = x'?另外,关于'Reddirect'指令方法,有什么方法可以将它们移动到那些.htaccess文件中,以便它们是最后一个被评估的? –

+1

@penguinegg是的,现有的查询字符串会自动追加。不,移动'Redirect'语句不会影响任何东西,因为它们是2个不同的模块。一个模块运行并完成它的工作,然后另一个模块运行并执行它,然后最终获得一个URI和一个重定向。 –

+0

如果我想在应用程序的不同位置指定不同的参数集,它会变得更加复杂吗?以下仅仅是一个例子(所以url结构可能没有意义)。假设我想直接将'http://domain/contacts.asp?group=A&add=1'设置为'http:// domain/contacts/A/1'和'http://domain/contacts.asp?group = B&admin = 0'到'http:// domain/contacts/B/0',但我仍然希望'http:// domain/contacts.asp'重定向到'http:// domain/contacts'(保留任何随机参数如contacts.asp?view =全部完整)。我将如何修改上述? –

相关问题