mod_rewrite:在不添加查询字符串的情况下将所有内容重写为index.php

时间:2015-05-27 13:14:29

标签: php apache .htaccess mod-rewrite redirect

我知道有这样的成千上万的问题,但我似乎无法为我的问题找到合适的解决方案。

我正在尝试编写下载脚本。文件夹结构如下:

  • __管理员/
  • __上传/
  • 的index.php
  • 的.htaccess

这是我的.htaccess文件:

RewriteEngine on

RewriteCond %{REQUEST_URI} !^/index.php
RewriteRule ^(.*?)$ index.php?file=$1 [QSA,L]

我想将每个请求重定向到index.php作为参数:

files.domain.com/awesomefile.zip -> files.domain.com/index.php?file=awesomefile.zip

这可以按预期工作,但如果我输入http://files.domain.com/__adminhttp://files.domain.com/admin(不带斜线),则会分别将http://files.domain.com/__admin/?file=__admin重写为http://files.domain.com/admin/?file=admin(与其他现有目录相同) )。我知道mod_dir可能是罪魁祸首,但在.htaccess中设置DirectorySlashes off并没有任何效果。

  1. 如何摆脱向网址添加查询字符串的额外重定向(由mod_dir引起?)?我想完全隐藏用户的重定向。
  2. 为什么它会影响admin(即使它不是目录)?
  3. 编辑:我很抱歉让人感到困惑,这里有一些例子可以更好地描述我的意思:

    • 用户类型:http://files.domain.com/file.zip
      用户看到:http://files.domain.com/file.zip
      内部重定向:http://files.domain.com/index.php?file=file.zip
      这是理想的行为。

    • 用户类型:http://files.domain.com/admin/(请注意尾随斜杠)
      用户看到:http://files.domain.com/admin/
      内部重定向:http://files.domain.com/index.php?file=admin/

    • 用户类型:http://files.domain.com/admin
      用户看到:http://files.domain.com/admin/?file=admin< - 为什么?
      内部重定向:http://files.domain.com/index.php?file=admin

    最后一个例子显示了我的问题。我想摆脱用户不应该看到的查询字符串!

2 个答案:

答案 0 :(得分:2)

如果URI与目录名匹配,那么mod_dir将添加尾部斜杠是正确的。因此,您有一个像/__admin这样的URI,它会被重写为/__admin/,因为有一个名称的目录。您可以控制此行为。

您可以通过DirectorySlash指令

更改此行为
DirectorySlash Off

在重写规则之前放置它。

这仍然无法解释您添加斜杠的/admin示例。我会质疑这是否可以重现。

请注意与关闭DirectorySlash相关的安全警告。您可能会引入一个安全漏洞。

http://httpd.apache.org/docs/2.2/mod/mod_dir.html

答案 1 :(得分:1)

您的规则设置为每个请求都将定向到索引页面,这意味着对子文件夹的请求也会受到影响,您可以在规则中指定需要从规则中忽略哪些文件,如下所示:

RewriteCond %{REQUEST_URI} !^(/index\.php|_admin)