.htaccess文件夹作为root index.php

时间:2015-07-29 08:21:29

标签: .htaccess mod-rewrite

我需要的是任何子文件夹作为参数传递给根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

1 个答案:

答案 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时,上面实际发生的是:

  1. 初步要求:
    /projects(没有斜杠)

  2. .htaccess内部重写:
    /index.php?dir=projects/(请注意,请求网址仍为/projects

  3. mod_dir现在通过在URL路径的末尾附加斜杠来启动并“修复”初始请求(/projects - > /projects/)。但是,来自重写URL(上面)的查询字符串将通过:
    /projects/?dir=projects/(这是301外部重定向,即新请求!)

  4. .htaccess中的内部重写(再次 - 新请求):
    /index.php?dir=projects/&dir=projects/(请注意,请求仍为/projects/?dir=projects/dir=projects/查询参数的加倍是QSA上的RewriteRule标志的结果(我认为这是其他请求所必需的?)。您的PHP脚本只会看到一个dir GET参数(后者会覆盖前者),除非您在dir[]=$1/中包含RewriteRule并且最终会得到一个2元素数组!< / p>

  5. 您的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