使用mod_rewrite来模拟多个子目录

时间:2011-03-12 12:48:05

标签: php mod-rewrite clean-urls

我的.htaccess文件目前看起来像这样:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule /?([A-Za-z0-9-]+)/?$ index.php?page=$1 [QSA,L]

它适用于http://site.com/aaaaa等网址,但对于http://site.com/aaaa/bbb这样的网址,$ _GET ['page']变量只包含bbb而不是aaaaa / bbb。

有没有办法获取页面变量中的所有子目录?

5 个答案:

答案 0 :(得分:1)

我建议将/添加到最后一行中接受的字符列表中:/?([A-Za-z0-9/-]+)/?$

答案 1 :(得分:1)

在这一行:

RewriteRule /?([A-Za-z0-9-]+)/?$ index.php?page=$1 [QSA,L]

您错过了^以匹配整个字符串。此外,在您的字符串中,您希望匹配网址中的/。所以应该是:

RewriteRule ^/?([A-Za-z0-9-/]+)/?$ index.php?page=$1 [QSA,L]

错过^会让你获得最后一次不匹配的比赛。

答案 2 :(得分:1)

为什么不捕获一切

像这样,我想:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*) temp.php?page=$1 [QSA,L]


使用此(考虑到我的脚本位于temp文件夹中)http://tests/temp/blahhttp://tests/temp/blah/glop都被重定向到t emp.php,{{1含有'blah'或$_GET['page']


这通常是使用Zend Framework完成的,例如(参见here参考)

答案 3 :(得分:0)

你有没有理由使用这些字符范围?

为什么不使用:

RewriteRule ^(.*)$ index.php?page=$1

同样危险的是使用这样的东西你可能会错过“页面”GET变量。我不确定哪个优先,但要么是不好的行为。

我见过这种行为的示例不会将路径作为GET参数传递,而是使用php从$_SERVER['REQUEST_URI')

中提取它

答案 4 :(得分:0)

如果您只想允许每个path segments中的字符[A-Za-z0-9-],请尝试以下操作:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^/?([A-Za-z0-9-]+(/[A-Za-z0-9-]+)*)/?$ index.php?page=$1 [QSA,L]

顺便说一句:你应该选择一种拼写,有或没有斜杠,如果它是另一种形式,则重定向。