【问题标题】:Query string appended to URL when 2 rewriterules are applied应用 2 个重写规则时附加到 URL 的查询字符串
【发布时间】:2014-09-27 22:38:54
【问题描述】:

我正在将一个站点从经典的 asp 重写为 php。不是所有的新文件名都匹配,所以我不能简单地将 .asp 重写为 .php。 php 站点将使用更具可读性的 URL。我遇到以下情况的问题:

旧页面

old-profile.asp?company=ABC+Limited

需要重定向到

/profiles/ABC+有限公司

以下 rewritecond/rewriterule 在应用的唯一规则时完美运行:

RewriteCond %{QUERY_STRING}     ^company=([^/]+)$    [NC]
RewriteRule ^old-profile\.asp$ /profiles/%1? [R=301,L]

所以如果我输入 /old-profile.asp?company=ABC+Limited 结果是 /profiles/ABC+Limited

但是,稍后在 .htaccess 文件中我需要使用以下重写规则:

RewriteRule ^profiles/([^/]+)$ /new-profile.php?company=$1

这也适用于新网站上的页面,即 URL /profiles/ABC+Limited 将在 /new-profile.php?company=ABC+Limited 处显示页面

这一切听起来都不错,但问题是这两条规则不能相互配合。问题在于以下 URL 的结果:

/old-profile.asp?company=ABC+Limited

是:

/profiles/ABC+Limited?company=ABC+Limited

我不想在这个新 URL 的末尾加上 ?company+ABC+Limited。在第一个重写中,我添加了尾随 ?如果我注释掉第二条规则,这条规则可以正常工作,但是当两个规则都应用时,查询字符串就会出现。

非常感谢您的帮助!

更新 在@anubhava 和@Samurai8 的帮助下,我发现了这个问题的原因。旧网站强制 www。在 URL 和新站点的开头强制没有 www。在 URL 的开头。

万维网。没有 www。规则是在我的 htaccess 文件中的所有其他规则之后,并导致了这个问题。我把它移到文件的开头,一切正常。

【问题讨论】:

  • 是否可以在第一条规则之前使用第二条规则?或者作为解决方法:将规则 1 更改为 'tmp-profiles ...' 作为结果,并在末尾添加第三条规则,将 tmp-profile 转换为 profile。
  • 嗨@JörgMäder,我已经尝试更改订单,但没有任何区别。第一条规则是 301,因此这些规则不应在同一个请求上运行,因此不应干扰 - 但有些事情发生了。我将尝试更改规则并添加另一个...
  • 我还想从旧 URL 到新的“漂亮” URL 的 301 以获取搜索引擎的功劳,所以不知道如果我添加另一个规则会如何工作?跨度>
  • 响应将规则一更改为 tmp-page 并添加第三条规则,结果相同。我想我实际上可以创建一个新页面并从该页面重定向,但这会有点混乱,我认为会阻止将我们的搜索信用从旧页面带到新页面?
  • 首先,将[R=301 更改为[R=302。使用永久重定向进行测试是一件很可怕的事情。这实际上可能是首先发生这种情况的原因。然后清除浏览器缓存,打开开发者控制台(右键单击>检查元素),转到网络选项卡并在 URL 栏中输入 old-profile.asp?company=Pretty+Unicorn。查看网络选项卡并准确观察正在发生的事情。什么 url 重定向到什么页面?这将为您提供内部实际发生的情况的提示。如果还没有该标志,则将[L] 标志添加到每个规则。

标签: apache .htaccess mod-rewrite


【解决方案1】:

保持你的 .htaccess 像这样:

Options +FollowSymLinks -MultiViews
RewriteEngine On
RewriteBase /

RewriteCond %{QUERY_STRING} ^company=([^&]+)    [NC]
RewriteRule ^old-profile\.asp$ /profiles/%1? [R=301,L,NE,NC]

RewriteRule ^profiles/([^/]+)/?$ new-profile.php?company=$1 [L,QSA]

然后确保在新浏览器中进行测试以避免旧浏览器缓存。

【讨论】:

  • 谢谢@anubhava - 我知道这是您的专业领域。我在 .htaccess 中尝试了您的代码,得到了相同的结果。所以我然后尝试了一个全新的仅包含这些规则的 htaccess 文件并且它有效,但我的旧代码也是如此,所以我的 htaccess 中肯定有另一个问题。
  • 如果您还有其他规则,请确保将这些规则放在它们之前。如果这不起作用,请尝试发布有问题的整个 .htaccess,以便我进行调查并提出一些补救措施。
  • 我已经编辑了这个问题。问题似乎是我强迫没有www。在所有 URL 之前,此规则在其他 URL 之后。我已经把这条规则摆在他们面前,它似乎奏效了。这听起来对您来说是一个合理的解释和解决方案吗?
  • 是的,听起来不错。 www. to no www 规则必须放在上述规则之前。
猜你喜欢
  • 2011-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-18
  • 1970-01-01
  • 2015-09-10
  • 2016-09-13
  • 1970-01-01
相关资源
最近更新 更多