您需要使用 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-z、A-Z、0-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}相同,使用简写字符类)。