我正在php中设计一个mvc应用程序,我想重新格式化并解析url。我的文件夹如下:
- 应用程序
- 公共
- 资产
- .htaccess
我的htaccess文件包括:
Options -Multiviews
RewriteEngine On
RewriteBase /mymvctest/public
RewriteRule ^(.*)/$ index.php?url=$1 [END,QSA]
RewriteRule ^(.*)$ index.php?url=$1 [END,QSA]
Index.php接收一个";url";GET变量并将其打印出来。
如果我的输入url是/mymvctest/public/atestvalue
,那么最终url将是相同的,/mymvctest/public/atestvalue
,并且";atestvalue";也将打印在索引中。
但是,当我的输入url包含一个有效目录时,查询会显示在url中。例如,如果我的url是/mymvctest/public/Assets
,那么最终的url将是/mymvctest/Public/Assets/?url=Assets
。令人惊讶的是,当我在";资产";,/mymvctest/public/Assets/
,最终的url将与我的输入url相同:/mymvctest/public/Assets/
。我得到了";url";但在这两种情况下都是可变的。
为什么会发生这种事!?
之所以会这样,是因为/mymvctest/public/Assets
是一个实际的目录。第一个mod_rewrite
规则执行并使其在内部为/mymvctest/public/index.php?url=Assets
。
Apache还有另一个名为mod_dir
的模块(出于安全原因(,它捕获所有指向目录并缺少尾部斜杠的原始URL。然后,它用带有R=301
的尾部斜杠将它们重定向到同一路径,从而使最终URL为:/mymvctest/public/Assets/?url=Assets
。
在其他情况下,为了防止这种行为,请使用
DirectorySlash off
然而,这可能会在浏览器中公开您的目录内容。为了防止这种情况,也使用此指令:
Options -Indexes
看第2行和第3行。
RewriteEngine On
#if not a file
RewriteCond %{REQUEST_FILENAME} !-f
#if not a directory
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?url=$1 [END,QSA]
输入Url:
http://localhost/mymvctest/public/testvalue
http://localhost/mymvctest/public/Assets/
输出Url:
http://localhost/mymvctest/public/index.php?url=testvalue
http://localhost/mymvctest/public/Assets/