我需要的是任何子文件夹作为参数传递给根index.php 这是代码,它确实有效。
RewriteEngine On
RewriteBase /
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteCond %{SCRIPT_FILENAME} -d
RewriteRule ^(.+?)(/[^/]*|)$ index.php?dir=$1/ [L,QSA]
有一个问题:
当网址是这样的时候('项目'之后没有结束斜线):
http://example.com/projects
重写规则会更改地址栏中的链接,如下所示:
http://example.com/projects/?dir=projects/
地址栏中的url是否总是保持不变(无论是否有结束斜杠),所以dir参数对用户不可见?
我尝试了多个规则 - 第一个添加结束斜杠,然后第二个规则将目录作为参数传递,但到目前为止没有运气。
编辑:到目前为止,感谢w3d,我设法让它工作。在.htaccess中只需添加: DirectorySlash Off答案 0 :(得分:0)
tl; dr 在RewriteRule
模式中强制使用尾部斜杠(并删除DirectorySlash Off
指令,即保留On
)。
RewriteRule ^(.+)/$ index.php?dir=$1/ [L,QSA]
正如评论中所建议的,这种“奇怪的”重定向是mod_dir的DirectorySlash On
指令的结果,默认情况下为On
。这可以通过在.htaccess文件的顶部包含DirectorySlash Off
来快速解决(或强制使用尾部斜杠 - 请参见上文和下方)。
DirectorySlash On
指令指示Apache自动将斜杠附加到以文件系统目录结尾的URL。从这个意义上说,它正在“修复”URL。 mod_dir通过301外部重定向实现此目的。
因此,当启用DirectorySlash
时,上面实际发生的是:
初步要求:
/projects
(没有斜杠)
.htaccess内部重写:
/index.php?dir=projects/
(请注意,请求网址仍为/projects
)
mod_dir现在通过在URL路径的末尾附加斜杠来启动并“修复”初始请求(/projects
- > /projects/
)。但是,来自重写URL(上面)的查询字符串将通过:
/projects/?dir=projects/
(这是301外部重定向,即新请求!)
.htaccess中的内部重写(再次 - 新请求):
/index.php?dir=projects/&dir=projects/
(请注意,请求仍为/projects/?dir=projects/
)
dir=projects/
查询参数的加倍是QSA
上的RewriteRule
标志的结果(我认为这是其他请求所必需的?)。您的PHP脚本只会看到一个dir
GET参数(后者会覆盖前者),除非您在dir[]=$1/
中包含RewriteRule
并且最终会得到一个2元素数组!< / p>
您的RewriteRule
模式看起来也不必要地复杂。您可以简单地使尾随斜杠可选。即:
RewriteRule ^(.+?)/?$ index.php?dir=$1/ [L,QSA]
或者,说完以上所有内容后,你应该留下DirectorySlash On
(默认值)并简单地强制使用尾随斜杠!例如:
RewriteRule ^(.+)/$ index.php?dir=$1/ [L,QSA]
mod_dir现在会在内部重写之前启动(因为如果没有尾部斜杠,它将无法匹配)。这也可以更好地规范您的网址,并且关闭网站也存在潜在的安全风险。
参考:
http://httpd.apache.org/docs/2.2/mod/mod_dir.html#directoryslash