Regex mod_rewrite删除子文件夹和php

Regex mod_rewrite删除子文件夹和php,regex,.htaccess,mod-rewrite,Regex,.htaccess,Mod Rewrite,我想让我的url从 root.com/sub/?page=home 到 root.com/home 我想删除子文件夹,删除php,只留下最基本的url。 如果可能,我还想将所有非“root.com/[*]”重定向回root.com。 例如,“root.com/home/index.php?page=home”和“root.com/sub/test/”都会重定向回“root.com” .htaccess和mod_重写似乎是最好的方法 到目前为止,我有: RewriteEngine On #remo

我想让我的url从

root.com/sub/?page=home

root.com/home

我想删除子文件夹,删除php,只留下最基本的url。 如果可能,我还想将所有非“root.com/[*]”重定向回root.com。 例如,“root.com/home/index.php?page=home”和“root.com/sub/test/”都会重定向回“root.com”

.htaccess和mod_重写似乎是最好的方法 到目前为止,我有:

RewriteEngine On
#remove subfolder, WORKS
RewriteCond %{HTTP_HOST} ^root\.com$ [OR]
RewriteCond %{HTTP_HOST} ^www\.root\.com$
RewriteCond %{REQUEST_URI} !^/sub/
RewriteRule (.*) /sub/$1 [L]
这将起作用并删除子文件夹

#remove PHP, not working :S
RewriteRule ^([a-zA-Z0-9_-]+)$ /index.php?page=$1 [L]
RewriteRule ^([a-zA-Z0-9_-]+)/$ /index.php?page=$1 [L]
但这不起作用,并留下“?page=home”等内容 我想我在第二条规则的正则表达式之前遗漏了一些东西,但我对这一点还不熟悉

提前谢谢

编辑:考虑到[L]的事情,仍然没有骰子


我猜它需要一次完成,而不是单独迭代。

mod_write的问题通常在于冲突;在这种情况下,第二个块将与第一个块后缀匹配,从而产生无限循环或500错误

您应该将标志
[L]
附加到每个
重写规则
。例如

RewriteEngine On
#remove subfolder
RewriteCond %{HTTP_HOST} ^root\.com$ [OR]
RewriteCond %{HTTP_HOST} ^www\.root\.com$
RewriteCond %{REQUEST_URI} !^/sub/
RewriteRule (.*) /sub/$1 [L]

#remove PHP
RewriteRule ^([a-zA-Z0-9_-]+)$ /index.php?page=$1 [L]
RewriteRule ^([a-zA-Z0-9_-]+)/$ /index.php?page=$1 [L]
如果没有
[L]
/abc
将被重写为
/index.php?page=abc
,这将被重写为
/sub//index.php?page=abc


我75%肯定这就是问题所在,但它还没有经过测试,所以我不打算打赌。尽管如此,尝试也不会有什么坏处。

我认为这条规则就是问题所在:

重写规则(.*)/sub/$1[L]

尝试将其更改为:


RewriteRule(.*)/sub/index.php?page=$1[L]

我尝试了一下,但仍然得到了一个类似“www.root.com/?page=home”的url,所以子文件夹Ramins不见了,但php仍然在使用中尝试一下(在其他变体中)仍然无法让它工作:Sbump/当我从我的计算机查看该网站时,发现了另一个问题(第一部分)显示为“www.root.com/page”,这很好,但在我的队友电脑上显示为“www.root.com/sub/page”wtf。