【问题标题】:using mod_rewrite to simulate multiple sub-directories使用 mod_rewrite 模拟多个子目录
【发布时间】:2011-03-12 12:48:04
【问题描述】:
我的 .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。
有没有办法获取页面变量中的所有子目录?
【问题讨论】:
标签:
php
mod-rewrite
clean-urls
【解决方案1】:
我建议将/ 添加到最后一行的接受字符列表中:/?([A-Za-z0-9/-]+)/?$。
【解决方案2】:
为什么不直接捕捉一切?
我想是这样的:
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*) temp.php?page=$1 [QSA,L]
有了这个(考虑到我的脚本在temp 文件夹中),http://tests/temp/blah 和 http://tests/temp/blah/glop 都被重定向到 temp.php,$_GET['page'] 包含“blah”或'blah/glop' .
这通常是 Zend Framework 所做的,例如 (请参阅 here 以获取参考)。
【解决方案3】:
在这一行:
RewriteRule /?([A-Za-z0-9-]+)/?$ index.php?page=$1 [QSA,L]
您错过了匹配整个字符串的 ^。此外,在您的字符串中,您希望匹配 URL 中的 /。所以应该是:
RewriteRule ^/?([A-Za-z0-9-/]+)/?$ index.php?page=$1 [QSA,L]
错过^ 会让你获得最后一场不贪婪的比赛。
【解决方案4】:
您使用这些字符范围有什么原因吗?
为什么不使用:
RewriteRule ^(.*)$ index.php?page=$1
使用这样的东西也很危险,你可能会错过“page” GET 变量。我不确定哪个优先,但要么是不良行为。
我看到的有关此行为的示例不会将路径作为 GET 参数传递,而是使用 php 从 $_SERVER['REQUEST_URI') 中提取它
【解决方案5】:
如果你只想在每个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]
顺便说一句:你应该选择一个拼写,带或不带斜杠,如果是另一种形式,则重定向。