0

这是我的目录:

root/
├── app/
├── public/
|       ├── css/
|       ├── img/
|       ├── index.php
|       ├── .htaccess
├── .htaccess

我希望对文件夹的每个请求都root/被重写到public/文件夹,然后通过变量传递index.phpurl $_GET
这是我的root/.htaccess

DirectorySlash off
RewriteEngine on
RewriteRule (.*) public/$1

这是我的root/public/.htaccess

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]

没有RewriteCond %{REQUEST_FILENAME} !-d,因为我不希望用户看到目录,例如:root/css.

当我去root/app它工作正常,我得到$_GET['url'] = 'app'。但是当我去时,root/public我没有得到$_GET['url'] = public;相反,它向我显示了public文件夹的目录结构。当我去root/public/(注意尾部斜杠)时,它会带我去root/public/index.php并且它也不会传递变量。
如果你能告诉我如何解决这个问题,我将不胜感激。我想root/public重写为root/public/index.php?url=public.

编辑:当我去root/public/css它返回$_GET['url'] = 'css'而不是$_GET['url'] = 'public/css'. 似乎在public访问该文件夹时,它忽略了第一个.htaccess文件。

4

2 回答 2

0

发生这种情况是因为您关闭了DirectorySlash. 请参阅mod_dir 的 apache 文档

安全警告

关闭尾部斜杠重定向可能会导致信息泄露。考虑一种情况,其中 *mod_autoindex* 处于活动状态 ( Options +Indexes) 并DirectoryIndex设置为有效资源 (例如index.html),并且没有为该 URL 定义其他特殊处理程序。在这种情况下,带有斜杠的请求将显示 index.html 文件。但是没有斜杠的请求会列出目录内容。

由于“public”是一个目录,当您请求/public它时,它不会通过根的 htaccess 文件路由到 public,它会在 mod_rewrite 甚至有机会处理它之前由 mod_autoindex 提供服务。

因此,您需要重新打开目录斜杠或者只是注释掉该行,因为它默认处于打开状态),然后更改公共目录中的规则以删除尾部斜杠,并处理空白请求(例如 for /public/):

RewriteEngine on
RewriteRule ^$ index.php?url=public [QSA,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*?)/?$ index.php?url=$1 [QSA,L]

编辑:

如果我删除DirectorySlash off,当我去root/css它时,它会将我重定向到root/public/css/?url=css. 我必须保留它以防止这种情况发生。

然后,您需要做的是在检查任何实际目录之前处理根 htaccess 文件和路由中的所有内容。因此,删除或注释掉RewriteEngine On公共目录中的,并将根目录中的规则更改为:

DirectorySlash Off

RewriteRule ^public/?$ /public/index.php?url=public [L,QSA]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^public/(.*)$ /public/index.php?url=$1 [L,QSA]

RewriteCond %{REQUEST_URI} !^/public/
RewriteRule ^([^/]+)/?$ /public/index.php?url=$1
于 2013-07-22T18:02:56.727 回答
0

访问该public文件夹时,它会跳转到该root/public/.htaccess文件,而忽略该root/.htaccess文件。为了防止这种情况发生,我只使用.htaccess了目录中的一个文件root

# Prevent redirection to directory: 'root/css' won't turn into 'root/public/css?url=css'
DirectorySlash off

RewriteEngine on

# When 'root/css', 'root/img' or 'root/js' is accessed, return the real path 'root/public/css/...'
RewriteRule ^((css|img|js)/(.+))$ public/$1 [END]
# For all the requests just pass the u
RewriteRule ^(.*)$ public/index.php?url=$1 [QSA,END]
于 2013-07-23T02:16:15.840 回答