【问题标题】:CakePHP 301 Redirects appending extra query string parameterCakePHP 301 重定向附加额外的查询字符串参数
【发布时间】:2012-08-29 02:48:27
【问题描述】:

我正在尝试重定向域名上的旧 asp 页面,以便它们链接到 CakePHP 版本(使用 1.3)上各自的页面。域名是一样的。正在添加这些重定向,因此搜索引擎中的结果会转到新的 Cake 页面。

我的 /.htaccess 文件中有一堆 Redirect 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 参数是 not 附加的。我想将所有这些重定向保留在我的 .htaccess 文件中。如何防止附加此url 查询字符串参数?

【问题讨论】:

    标签: apache cakephp mod-rewrite redirect url-rewriting


    【解决方案1】:

    这看起来像是 mod_rewrite 和 mod_alias 相互重叠的情况。当应用Redirect 指令时,URI 处理管道不会结束,它会继续通过管道,mod_rewrite 会做它的事情。不幸的是,最终结果并不总是你想要的。你可以坚持使用 mod_rewrite 并删除 Redirect 指令。

    您可以删除 2 个 Redirect 指令并将这 2 个 RewriteRules 添加到 将请求映射到 app/webroot 的那些:

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

    【讨论】:

    • 感谢您的回复。我想我明白你在说什么。 RewriteRule ^contacts\.asp$ http://domain/contacts [L,R=301] 会保持参数不变吗?例如,http://domain/contacts.asp?contact=x 是否会重定向到http://domain/contacts?contact=x?另外,关于Reddirect 指令方法,有什么方法可以在这些 .htaccess 文件中移动它们,以便它们是最后评估的?
    • @penguinegg 是的,现有的查询字符串将自动附加。不,移动 Redirect 语句不会影响任何事情,因为它们是 2 个不同的模块。一个模块运行并执行它的操作,然后另一个模块运行并执行它的操作,最后你有一个 URI 和一个重定向。
    • 如果我想将不同的参数集定向到应用程序中的不同位置,是否会变得更复杂?以下只是一个示例(因此 url 结构可能没有意义)。假设我想将http://domain/contacts.asp?group=A&amp;admin=1 直接连接到http://domain/contacts/A/1http://domain/contacts.asp?group=B&amp;admin=0http://domain/contacts/B/0,但我仍然希望http://domain/contacts.asp 重定向到http://domain/contacts(保持任何随机参数,例如contacts.asp?view=all 不变)。我将如何修改上述内容?
    • @penguinegg 你不会修改上面的,那是完全不同的事情。上述规则适用于 URI /contacts.asp/users.asp,仅此而已。您必须为此制定单独的规则。这与您的 CakePHP 重定向问题无关。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-30
    • 1970-01-01
    相关资源
    最近更新 更多