Apache重写规则;t仅适用于特定前缀


Apache rewrite rules doesn't work only with particular prefix

我正在编写的脚本有一些问题。

我有这样的网址:

forum.php?f=topic&g=$1&id=$2&alias=$3
forum.php?f=group&g=$1
forum.php

我需要重写那些已经:

/forum/group/id-alias_topic > forum.php?f=topic&g=[GROUP]&id=[ID]&alias=[ALIAS_TOPIC]
/forum/group > forum.php?f=group&g=[GROUP]
/forum > forum.php

我尝试过:

RewriteRule ^forum/(['w'-]+)/([0-9]+)-(['w'-]+) forum.php?f=topic&g=$1&id=$2&alias=$3
RewriteRule ^forum/(['w'-]+) forum.php?f=group&g=$1
RewriteRule ^forum/ forum.php

但它不起作用。它只向我显示forum.php
每个以/forum开头的URL都会显示/forum.php 提供的默认页面

例如,forum.php将显示文本"MAIN PAGE"。

forum.php?f=topic&g=[GROUP]&id=[ID]&alias=[ALIAS_TOPIC]应显示"GROUP+ID+ALIAS_TOPIC"

但如果我访问/forum/android/1-first_topic,它会显示"主页"

如果我将^forum替换为,例如^foru,它会起作用。我已经清理了浏览器缓存并重新启动了apache,但它仍然不起作用。其他浏览器的问题也是一样的。在我的/var/www中有以下文件和目录:

administrator.php  assets  cache  forum_functions.php  forum.php  functions.php  global.php  index.php  media  notfound.php  OLD  pwdgen.php  robots.txt  rss.php  simple_html_dom.php  store.php  template  v.php

你有什么建议吗?

重写日志:http://pastebin.com/MeapYeBA

因为您没有使用[L](最后一个)标志,也没有用$锚定表达式的末尾,所以每一个都匹配掉前两个之后的最后一个规则。

例如,此URL将同时匹配第一条和最后一条规则:example.com/forum/group/123-thing,因为最后一条与forum/后面的任何匹配(如果未被$终止)。

添加[L]标志以防止失败,并使用$ 终止正则表达式

# Don't apply these if the file actually exists (like forum.php)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# This one doesn't really need to terminate in $
RewriteRule ^forum/([^/]+)/([0-9]+)-(.+) forum.php?f=topic&g=$1&id=$2&alias=$3 [L]
# This one must terminate with $
RewriteRule ^forum/([^/]+)$ forum.php?f=group&g=$1 [L]
# As must this one..
RewriteRule ^forum/?$ forum.php [L]

我还用更简单的[^/]+替换了您的['w'-]+,以将所有内容匹配到下一个/。在上一条规则中,我添加了/?以允许可选的尾随/。它与['w'-]+同样适用,但由于您打算匹配/之间的所有内容,因此[^/]+是一种更常见的模式。

上面的每一条规则都在http://htaccess.madewithlove.be/

您必须为停止其他规则放置skip标志在重写规则(如)的末尾使用tihs[S]

 RewriteRule ^forum/(['w'-]+)/([0-9]+)-(['w'-]+)$ forum.php?f=topic&g=$1&id=$2&alias=$3 [S=2]
 RewriteRule ^forum/(['w'-]+)$ forum.php?f=group&g=$1 [S=1]
 RewriteRule ^forum/$ forum.php

感谢@Michael Berkowski 找到了解决方案

sudo nano /etc/apache2/sites-enabled/000-default 

并删除所有出现的MultiViews,然后重新启动apache。