【问题标题】:.htaccess folder as parameter to root index.php.htaccess 文件夹作为根 index.php 的参数
【发布时间】:2015-07-29 08:21:28
【问题描述】:

我需要的是作为参数传递给根 index.php 的任何子文件夹 这是代码,它确实有效。

RewriteEngine On
RewriteBase /
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteCond %{SCRIPT_FILENAME} -d
RewriteRule ^(.+?)(/[^/]*|)$ index.php?dir=$1/ [L,QSA]

有问题:

当 url 是这样的时候('projects' 后面没有斜杠):
http://example.com/projects

重写规则改变了地址栏中的链接,它看起来像这样:
http://example.com/projects/?dir=projects/

地址栏中的 url 是否有可能始终保持不变(无论是否有斜杠),因此用户看不到 dir 参数?

我尝试了多个规则 - 第一个添加结束斜杠,然后第二个规则将目录作为参数传递,但到目前为止没有运气。

编辑:到目前为止,感谢 w3d,我设法让它工作。在 .htaccess 中添加: 目录斜线关闭

【问题讨论】:

  • 你是不是建议当你指定一个结束斜线时,地址栏中的 URL 不会改变?
  • 正是——这正是我想要的
  • 嗯,我最初的想法是,这是mo_dir中DirectorySlash On(默认)的结果。 Apache 自动将斜杠附加(修复)到作为目录的 URL。但是,我没有立即看到您的 RewriteRule 将如何产生给定的结果(index.php 去哪里了)?你还有其他指令吗?以及为什么这会导致外部重定向,而不是内部重写 - 正如您的 RewriteRule 指令所述?
  • 这些都是指令。我不知道它是如何省略 index.php 而只留下查询部分的。但我认为,如果在末端使用斜线它可以工作,那么有一种方法可以在没有结束斜线的情况下工作。如果我用 2 条规则再次尝试是否有逻辑 - 第一个在末尾添加斜杠,第二个将 dir 作为参数传递给根?
  • 由于projects 是文件系统上的实际目录,Apache 会自动在请求上附加一个斜杠(如上所述)——这可能是问题的根本原因。我很快就会自己尝试一些测试......

标签: .htaccess mod-rewrite


【解决方案1】:

tl;drRewriteRule 模式中强制使用尾部斜杠(并删除DirectorySlash Off 指令,即保留它On)。

RewriteRule ^(.+)/$ index.php?dir=$1/ [L,QSA]

正如 cmets 中所建议的,这个“奇怪的”重定向是 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/(请注意,请求 URL 仍然是 /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/ 查询参数的加倍是 RewriteRule 上的 QSA 标志的结果(我假设其他请求需要它?)。您的 PHP 脚本只会看到一个 dir GET 参数(后者会覆盖前者),除非您在 RewriteRule 中包含 dir[]=$1/ 并且您最终会得到一个 2 元素数组!

您的RewriteRule 模式看起来也过于复杂。您可以简单地将尾部斜杠设为可选。即:

RewriteRule ^(.+?)/?$ index.php?dir=$1/ [L,QSA]

或者,在说了以上所有内容之后,您可能应该离开DirectorySlash On(默认)并简单地强制使用尾部斜杠!例如:

RewriteRule ^(.+)/$ index.php?dir=$1/ [L,QSA]

mod_dir 现在将在您的内部重写之前 开始(因为如果没有尾部斜杠,它将不匹配)。这对于规范化您的 URL 也更好,并且关闭它也存在潜在的安全风险。

参考:
http://httpd.apache.org/docs/2.2/mod/mod_dir.html#directoryslash

【讨论】:

  • 谢谢 w3d。我会根据你的建议做一些测试。我不知道反对票,肯定不是我。谢谢!
  • 它有效,我做了一些测试。一切都很好。我正在使用带有 DirectorySlash On 和强制斜线 RewriteRule ^(.+)/$ index.php?dir=$1/ [L,QSA] 的版本
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-23
  • 2015-03-18
  • 1970-01-01
  • 1970-01-01
  • 2021-11-20
  • 1970-01-01
相关资源
最近更新 更多