htaccess - 重定向子目录中的所有请求,除非存在请求的文件

时间:2012-06-20 15:59:56

标签: .htaccess mod-rewrite redirect subdirectory file-exists

我正在使用php开发一个应用程序,我需要设置一个非常广泛的.htaccess重定向。我做了一些阅读,并尝试自己编写RewriteConds,但它比我的薪水高一点 - 我希望有更多经验的人可以提供帮助。这就是我想要完成的事情:

  • 该应用包含在www.example.com/app/中。请勿重定向此目录上方的任何内容。
  • 此目录中存在一些需要访问的文件。目前这些是/app/includes/*/app/sb_pages/*。这将在未来发生变化和扩展,因此我需要一个包含所有现有文件的优雅解决方案。如果在找不到文件时重定向在这些目录中触发,那就没关系了 - 我所关心的只是能够在没有重定向触发的情况下访问这些文件。
  • 应将所有其他请求重定向到/app/index.php,并在查询字符串中传递尾随网址。例如,对/app/path1/path2/的请求应重定向到/app/index.php?path=path1/path2/
  • 重定向不应该是透明的。当用户请求/app/path1/path2/时,我希望他们相信他们仍然留在那里。他们不应看到网址更改为/app/index.php?path=path1/path2/

为了更清晰,这里有几个案例要详细说明:

  • /app/includes/sidebar.php不应重定向。
  • /app/includes/nothing.html不存在 - 重定向正常
  • /app/path1/path2/应重定向到/app/index.php?path=path1/path2/。用户仍应将其当前网址视为/app/path1/path2/

我希望我已经清楚地解释了它并抢占了大多数问题。如果您需要澄清,请不要犹豫。在此先感谢您的帮助!

1 个答案:

答案 0 :(得分:4)

尝试将其添加到文档根目录中的.htaccess文件中:

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

请注意,如果您希望访问现有目录(而不是文件)也不会重定向,请在规则上方添加RewriteCond %{REQUEST_FILENAME} !-d