Php Apache重写规则没有';不能只使用特定的前缀

Php Apache重写规则没有';不能只使用特定的前缀,php,apache,rewrite,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

我写的剧本有点问题

我有这样的网址:

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
将显示文本“主页”

forum.php?f=topic&g=[GROUP]&id=[id]&alias=[alias\u topic]
应该显示“GROUP+id+alias\u topic”

但是如果我访问
/forum/android/1-first\u topic
它会显示“主页”

如果我将
^forum
替换为,例如
^foru
,它会工作。 我已经清理了浏览器缓存并重新启动了apache,但它仍然无法工作。 对于其他浏览器,问题也是一样的。 在my/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:

因为您没有使用
[L]
(last)标志,也没有使用
$
锚定表达式的结尾。在删除前两个后,每个表达式都匹配最后一个规则

例如,此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'-]+
,但由于您希望匹配
/
之间的所有内容,
[^/]+
是一种更常见的模式


上面的每一条规则都将在

进行测试和处理,因为您没有使用
[L]
(last)标志,也没有使用
$
锚定表达式的结尾。在删除前两条规则后,每一条规则都与最后一条规则相匹配

例如,此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'-]+
,但由于您希望匹配
/
之间的所有内容,
[^/]+
是一种更常见的模式


上述每一条规则都经过测试,并在

上进行处理。您必须在规则末尾添加跳过标志以停止其他规则,如

 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

您必须在“重写规则”的末尾添加“停止其他规则”的跳过标志,如

 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 

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

由于@Michael Berkowski找到了解决方案

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

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

您的代码无法运行。。。如果我删除了.htaccess并且访问了/forum/it,我认为我的服务器有一些问题,但是如果我的/forum.php没有进入/forum/但是进入了/?my error.log,那么没有.htaccess怎么办呢?只说关于php脚本中未定义的php变量的注意事项。没有关于.htaccess的任何内容。我尝试了你的上一个代码,但没有成功。我已经在我的文档根目录中添加了有关文件和文件夹的信息。最后,这个.htaccess文件属于
/
,不属于任何子目录。如果我访问administrator.php,它就会工作。如果我访问/forum/*它会显示应该显示/forum.php的页面。是的,.htaccess进入根目录。不,我的意思是它显示了没有正确参数的/forum.php。您的代码无法工作。。。如果我删除了.htaccess并且访问了/forum/it,我认为我的服务器有一些问题,但是如果我的/forum.php没有进入/forum/但是进入了/?my error.log,那么没有.htaccess怎么办呢?只说关于php脚本中未定义的php变量的注意事项。没有关于.htaccess的任何内容。我尝试了你的上一个代码,但没有成功。我已经在我的文档根目录中添加了有关文件和文件夹的信息。最后,这个.htaccess文件属于
/
,不属于任何子目录。如果我访问administrator.php,它就会工作。如果我访问/forum/*它会显示应该显示/forum.php的页面。是的,.htaccess进入根目录。不,我的意思是它显示没有正确参数的/forum.php。Thx,你的代码不工作,它返回我的代码的行为。Thx,你的代码不工作,它返回我的代码的行为相同。