.htaccess默认目录行为

时间:2014-12-23 14:54:38

标签: php apache .htaccess mod-rewrite

我刚开始学习Apache的.htaccess文件,我设置了一个网站,以便所有请求都来自我的索引文件(名为Main.php)。

然后通过wp GET var(例如wp = forum)获取“网页” - 我希望改为Domain/directory/Forum而不是当前Doman/directory/Main.php?wp=Forum

我面临的问题是我的所有“网页”都存储在他们自己的目录中,并由“webparts”组成,因此论坛将成为“论坛”的子目录,其中包含构成页面的文件。这导致我的重定向问题。

我创建了以下.htacess文件:

#turn redirect engine on
RewriteEngine On
#make sure URI is not a file
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^?]*)$ Main.php?wp=$1 [NC,L,QSA]

这在重定向时工作正常,直到它是一个输入为“wp”的目录,此时它将添加一个尾部斜杠并破坏传递的wp GET var(论坛/将根据需要传递给论坛)< / p>

以下是我认为它可能有效的两个例子:

主要(不是文件或目录)

  • 循环1:将重写更改命中为Main.php?wp = Main
  • 循环2:URI是文件(无变化)

MainContent(是一个目录)

  • 循环1:点击默认目录更改? (猜)改变 MainContent /(注意斜杠)
  • 循环2:启动.htaccess并将其更改为Main.php?wp = MainContent /
  • 循环3:URI是文件(无变化)

此外,无论何时在我的websever中使用尾随斜杠访问文件(例如:Main.php /),它都将显示没有链接或包含的文件。它只显示被请求的文件,似乎忽略任何和所有css ... php包含或其他任何东西(这是默认的Apache设置?)。

很抱歉这篇漫长且可能令人困惑的帖子。如果我需要清理任何东西,只需要大喊。

2 个答案:

答案 0 :(得分:2)

尝试:

#turn redirect engine on
RewriteEngine On
DirectorySlash Off
#make sure URI is not a file
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)/?$ Main.php?wp=$1 [NC,L,QSA]

答案 1 :(得分:0)

查看Drupal的.htaccess文件可能会有所帮助,它可以执行相同的操作 - 即通过索引文件重定向所有请求。该文件中最相关的代码段是:

  # Pass all requests not referring directly to files in the filesystem to index.php?page=[rest of url]
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteCond %{REQUEST_URI} !=/favicon.ico
  RewriteRule ^(.*)$ index.php?page=$1 [L,QSA]

上面的第二个条件&#34;! -d&#34;可能会解决您描述的问题,但您可能仍需要做一些&#34;清洁&#34;在你的PHP代码中。值得查看整个Drupal .htaccess文件,因为它可以加强安全性,例如阻止访问某些文件等。