mod_rewrite删除子文件夹和php

时间:2011-01-24 03:40:47

标签: regex .htaccess mod-rewrite

我想让我的网址来自

root.com/sub/?page=home

TO

root.com/home

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

.htaccess和mod_rewrite似乎是最好的方法 到目前为止我有这个:

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]的事情,仍然没有骰子。

我猜它需要在一次点击而不是单独的迭代中完成。

2 个答案:

答案 0 :(得分:0)

mod_write的问题通常在于冲突;在这种情况下,第二个块将匹配第一个块追加后记,创建无限循环或500错误。

您应该将标记[L]附加到每个RewriteRule。 E.g。

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%肯定这是问题所在,但它没有经过考验,所以我不会打赌它。从来没有伤过尝试。

答案 1 :(得分:0)

这个规则是我认为的问题:

RewriteRule (.*) /sub/$1 [L]

尝试将其更改为:

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