【发布时间】: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