我正在编写的脚本有一些问题。
我有这样的网址:
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。