Php 通过.htaccess将$\u GET变量传递到虚拟目录

Php 通过.htaccess将$\u GET变量传递到虚拟目录,php,.htaccess,mod-rewrite,Php,.htaccess,Mod Rewrite,我有下面的.htaccess重写规则,用于将虚拟目录转换为参数,例如: www.example.com/usa/ny/nyc被PHP解释为www.example.com/index.PHP?path=usa/ny/nyc 我似乎不知道如何更改下面的regex,以处理虚拟目录本身的参数。例如,我想要: www.example.com/usa/ny/nyc/?display=off&settings=none被PHP视为www.example.com/index.PHP?path=usa/ny/ny

我有下面的
.htaccess
重写规则,用于将虚拟目录转换为参数,例如:

www.example.com/usa/ny/nyc
被PHP解释为
www.example.com/index.PHP?path=usa/ny/nyc

我似乎不知道如何更改下面的
regex
,以处理虚拟目录本身的参数。例如,我想要:

www.example.com/usa/ny/nyc/?display=off&settings=none
被PHP视为
www.example.com/index.PHP?path=usa/ny/nyc¶m=display:off,settings:none

更棘手的是,参数并不总是我在上面示例中使用的这两个选项,它们会动态变化。关于如何实现这一点,有什么想法或建议吗

RewriteRule ^/?([a-zA-Z_\-/]+)$ index.php?path=$1 [L]  

假设您希望不经修改地传递查询字符串,可以使用
[QSA]
(查询字符串附加)选项,如下所示:

RewriteRule /(.+)$ /index.php?path=$1 [L,QSA]
您可以找到
QSA
选项的文档。从文档中:

使用[QSA]标志,将映射对/pages/123?one=two的请求 到/page.php?page=123&one=two。如果没有[QSA]标志,则相同 请求将映射到/page.php?page=123,即现有 查询字符串将被丢弃

因此,您的PHP脚本将所有参数视为标准的
\u$\ u GET
参数,而无需进行任何其他修改

如果希望将结果更像一个典型的路径元素,可以使用以下方法:

RewriteRule /(.+)$ /index.php/$1 [L,QSA]

在上述情况下,您的查询字符串仍将被追加,但是您需要使用
$\u SERVER['path\u INFO']

显式处理路径是否要求以新格式重写附加参数,而不是将其作为附加
\u GET
参数传递?绝对不是!我可以用普通格式显示额外的参数,我只是使用了这种格式,因为我认为在我的PHP脚本中使用它不会太混乱,因为无论如何我都必须分解()字符串。谢谢!这正是我想要做的。在实现QSA标志后,我注意到当我访问一个没有尾随斜杠的虚拟目录时,它将URL重定向为:“localhost:8888/?path=/Application/MAMP/project”。你知道如何避免这种情况吗?你希望这个结果会是什么样子吗?理想情况下,我希望虚拟目录的重构对用户来说是不可见的,只是在PHP解析时看起来不同。例如,无论用户访问“”还是“”(带尾随斜杠),我都希望两者产生相同的结果。然而,有了QSA标志和无尾随斜杠,URL重定向到:“对我来说不起作用,但确实起了作用。”