【问题标题】:How do I rewrite this URL in Apache using mod rewrite?如何使用 mod rewrite 在 Apache 中重写此 URL?
【发布时间】:2022-01-30 20:29:59
【问题描述】:

我正在尝试重定向

"/w/index.php?title=TITLE_HERE&oldid=100"

"/wiki/TITLE_HERE.php".

我尝试了几件事,但根据我的研究,以下 RedirectMatch 应该可以工作。我读了很多关于在 Apache 中以不同方式重写的内容。当然,问题在于它不起作用。我访问时根本没有重定向

"/w/index.php?title=Example_Article&oldid=100".

这就是我正在尝试的:

RedirectMatch "^/w/index\.php?title=([^&]+)" "/wiki/$1.php"

我还有许多其他有效的重定向/重写规则。我不明白为什么这个不起作用。

我尝试了使用和不使用引号。我还尝试在末尾添加“.*$”,以防需要完全匹配,但没有运气。

字符类 [^&] 表示任何不是“&”的字符的一个实例。然后我想要一个或多个带有“+”量词的那些(当然是贪婪匹配)。这应该使它去掉“&oldid=100”并使事情变得顺利。但重定向甚至没有触发。

我还尝试了“(.+)”来查看是否不支持否定的正则表达式字符类,但也没有重定向。

顺便说一句,我的网站不是 wiki。它曾经是。现在它是静态 HTML。这就是重定向有益的原因。我知道您可以在 MediaWiki 中以不同的方式重写 URL。

(这是我的第一个 Stack Overflow 问题,请耐心等待。)

【问题讨论】:

  • 欢迎来到 SO,感谢您分享您的努力,如果您在浏览器中点击如下链接,请确认一下:http://localhost:80/w/index.php?title=TITLE_HERE&oldid=100
  • 嗨。谢谢。我正在尝试的链接是example.com/w/index.php?title=Article_Title&oldid=1459

标签: apache mod-rewrite


【解决方案1】:

将此添加到任何其他重写规则的顶部(在内部重定向重写规则下方(那些没有标志[R])):

RewriteCond %{REQUEST_URI} ^\/w\/index\.php$
RewriteCond %{QUERY_STRING} (?:^|&)title=(.+)(?:&|$)
RewriteRule ^ /wiki/%1.php [R=302,L,NE]

如果你感到困惑,$1%1 之间的区别是:%1RewriteCond 获取上一个捕获的字符串,而 $1 就像通常的 RegEx 反向引用一样,并且只包含当前RewriteRule的东西。

【讨论】:

  • 您似乎没有正确查看我的答案的重写规则。在您的回答中,您说您使用了(.+)(&|$),但是我提到了(.*)(?:&|$)!,您说它没有在浏览器中重定向,但是我已经提到了[R=302]
  • @SvendsenTech 你看到我的 RewriteRule 了吗?我在回答的时候已经提到了[R=302]。请再看一遍
  • .* 和 .+ 的区别在于前者表示零或多个,后者表示一个或多个。只要字符串中至少有一个字母,它们就等价。我无法让我的常规正则表达式知识在 mod_rewrite 中正常工作。但我现在有一个可行的解决方案。
  • @SvendsenTech 您误解了 apache 如何显示查询字符串。
  • @SvendsenTech,看看php中的$_SERVER变量,你就会明白查询字符串在QUERY_STRING中是如何显示的
【解决方案2】:

这对我有用:

RewriteCond %{REQUEST_URI} ^/w/index\.php$
RewriteCond %{QUERY_STRING} (?:^|&)title=([^&]+)
RewriteRule ^ /wiki/%1.php [R=302,L,NE]

最后使用“(.+)(&|$)”对我不起作用。找不到页面,也没有重定向。

注意!在我添加“[R=302,L]”之前,浏览器栏中的 URL 没有更新。现在它更新了。这里的解决方案是把对index.php的查询追加到URL的问号后面,所以变成了:

/wiki/Article_Name.php?title=Article_Name&oldid=100

这至少适用于使用我的设置显示网页。我想,如果我最后做对了,现在互联网上的死链接会少几百个。

【讨论】:

  • 您的 RewriteCond 不安全。有人可以设置xyztitle=123,它会重定向到wiki/123.php
  • 我认为缓存在这里起到了造成混乱的作用。目前正在调查(在您的帮助下)。
  • 这里没有缓存不是问题。我认为 Apache 本身并没有在这里解码 query_string
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多