【问题标题】:Redirect URLs with query strings in .htaccess [duplicate]使用 .htaccess 中的查询字符串重定向 URL [重复]
【发布时间】:2017-03-06 18:06:27
【问题描述】:

我正在尝试将一个旧站点迁移到一个使用混凝土 5 构建的新站点。旧网站使用查询字符串,我无法从具体5 中重定向。

  1. 有多个类别,如何只重定向查询部分?

    • 旧网址:example.com/portfolio/category?cat=hifi
    • 新网址:example.com/projecten/hifi
  2. 此外,我还有其他查询的 URL 也需要重定向:

    • 旧网址:example.com/portfolio/post.php?s=pagename-xxx-xxx
    • 新网址:example.com/projecten/pagename-xxx-xxx

帮助非常感谢!

【问题讨论】:

  • 到目前为止你尝试了什么?

标签: php apache .htaccess redirect concrete5


【解决方案1】:

您需要使用 mod_rewrite 和一个与QUERY_STRING 服务器变量匹配的条件 (RewriteCond)。

在您的根 .htaccess 文件中尝试以下操作以上任何现有的 mod_rewrite 指令。

RewriteEngine On

# PART 1 : Redirect old category URLs
RewriteCond %{QUERY_STRING} ^cat=(\w+)
RewriteRule ^portfolio/category$ /projecten/%1? [R=302,L]

# PART 2 : Redirect other old URLs
RewriteCond %{QUERY_STRING} ^s=(pagename-\w{3}-\w{3})
RewriteRule ^portfolio/post\.php$ /projecten/%1? [R=302,L]

这假设 pagename-xxx-xxx 中的 xxx 是 3 个文字字符(即 a-zA-Z0-9_)。

UPDATE#1:RewriteRule 替换后面的 ? 是必要的,以便从目标中删除查询字符串。或者,在 Apache 2.4+ 上使用 QSD 标志。

当您确定它工作正常时,将302(临时)重定向更改为301(永久)。 301 重定向被浏览器缓存,这会给测试带来问题。

UPDATE#2:对于“第 2 部分”中更新的 URL,请尝试以下操作:

# PART 2 : Redirect other old URLs
# To essentially remove the date prefix, eg. "YYYY-MM-DD-"
RewriteCond %{QUERY_STRING} ^s=/d{4}-/d{2}-/d{2}-(.+)
RewriteRule ^portfolio/post\.php$ /projecten/%1? [R=302,L]

^s=[0-9{4}]+-(.+?)/?[0-9{2}]+-(.+?)/?[0-9{2}]+-(.+?)/?(.*)$

这有点混搭,但对于您想要实现的目标来说,它看起来过于复杂?例如,为什么你需要匹配一个 optional 斜杠(即/?)?您的示例网址不包含任何斜杠?

诸如[0-9{4}]+ 之类的正则表达式模式并没有像您认为的那样做。这将匹配任何字符0123456789{} 1 次或多次。您似乎想要做的是完全匹配 4 位数字。例如。 [0-9]{4}(与/d{4}相同,使用简写字符类)。

【讨论】:

  • 第一部分工作,但第二部分不工作。我没有解释正确的网址。我会在下面发帖。
  • 我已经更新了关于您修改后的 URL 结构的答案。我还在我之前错过的替换上添加了?(我看到你已经使用了 QSD 标志 - 这是 Apache 2.4+ 上的替代方案)。
  • 是的,我试图按照我发现的一些示例来删除数字和破折号。但显然我不知道我在做什么......你的 nwe 代码运行良好,谢谢一百万!!!
猜你喜欢
  • 2021-04-05
  • 1970-01-01
  • 2022-03-24
  • 2012-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-08
相关资源
最近更新 更多