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

时间:2013-02-15 20:16:03

标签: php apache rewrite

我正在写一个脚本的问题。

我有这样的网址:

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开头的每个网址都会显示/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

你有什么建议吗?

Rewrite.log:http://pastebin.com/MeapYeBA

3 个答案:

答案 0 :(得分:1)

因为您没有使用[L](最后)标志而没有使用$锚定表达式的结尾,所以每个标记在通过前两个规则后都匹配最后一个规则。

例如,此网址将匹配第一个和最后一个规则:example.com/forum/group/123-thing,因为最后一条规则与forum/匹配,而跟随它的任何如果没有被{{ 1}}。

添加$标记以防止掉线,并使用[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/

处理

答案 1 :(得分:0)

你必须使用skip标志来阻止其他规则在RewriteRule结束时使用 [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

答案 2 :(得分:0)

感谢@Michael Berkowski提供解决方案

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

并删除所有出现的MultiView,然后重启apache。