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

Posted

技术标签:

【中文标题】htaccess - 重定向子目录中的所有请求,除非请求的文件存在【英文标题】:htaccess - redirect all requests within subdirectory, except if a requested file exists 【发布时间】:2012-06-22 19:44:59 【问题描述】:

我正在用 php 开发一个应用程序,我需要设置一个相当广泛的 .htaccess 重定向。我做了一些阅读并尝试自己编写 RewriteConds,但这有点超出我的工资等级 - 我希望有更多经验的人可以提供帮助。这是我想要完成的任务:

该应用程序包含在www.example.com/app/ 中。不要重定向此目录上方的任何内容。 此目录中存在一些需要访问的文件。目前这些是/app/includes/*/app/sb_pages/*。这将在未来发生变化和扩展,因此我需要一个包含所有现有文件的优雅解决方案。如果找不到文件时在这些目录中触发重定向,那很好 - 我关心的是能够在不触发重定向的情况下访问其中的文件。 所有其他请求应重定向到/app/index.php,并在查询字符串中传递尾随 url。例如,对/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/。用户仍应将其当前 URL 视为 /app/path1/path2/

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

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

那一定是我做错了——我试图写一个 .htaccess 来放入 /app,而不是根目录。像魅力一样工作,谢谢!

以上是关于htaccess - 重定向子目录中的所有请求,除非请求的文件存在的主要内容,如果未能解决你的问题,请参考以下文章

HTACCESS-重定向除特定目录以外的所有目录

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

ASP.NET httpRedirect :重定向除一个以外的所有页面

通过 httpd.conf / htaccess 重定向目录中除一个文件之外的所有文件

如何重定向除登陆页面外的子目录?

如何在没有 mod_rewrite 的情况下重定向除一个路径及其所有子路径之外的所有 URL?