RewriteRule将查询添加到某个url而不添加到其他url,这很奇怪



我正在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/

最新更新