如何重定向子文件夹中的所有请求

时间:2019-03-14 16:50:10

标签: php .htaccess

我有一个名为mydumbwebsite.com/的网站。在我的根文件夹中,有多个文件夹,其中一个是“ stuff”。可通过mydumbwebsite.com/stuff/直接访问此文件夹。我想创建一个.htaccess文件,该文件将重定向进入该子文件夹且仅该子文件夹的所有内容,因此这些网址为:

  1. mydumbwebsite.com/stuff/test
  2. mydumbwebsite.com/stuff/test /
  3. mydumbwebsite.com/stuff/test.php
  4. mydumbwebsite.com/stuff/test.php?test=yes
  5. mydumbwebsite.com/stuff/test2.php(不存在)
  6. mydumbwebsite.com/stuff/test2.php?test=是(不存在)
  7. mydumbwebsite.com/stuff/test/moar
  8. mydumbwebsite.com/stuff/test/moar/tests.php

...应该全部重定向到“ stuff”文件夹的index.php文件,即使它们指向的文件/文件夹也存在。

一些其他上下文:尽管我编造了示例,但我在本地主机上遇到了此问题。我有许多不同的项目,我不希望一个项目的.htaccess干扰其他项目。我尝试了this,但是它一直将我重定向到xampp主页:

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.+)$ index.php [QSA,L]

我尝试将其更改为此,但是不能涵盖所有实例,例如nr。 2、3和4:

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.+)$ /stuff/index.php [QSA,L]

3 个答案:

答案 0 :(得分:2)

您需要删除条件!-d!-f,它们表示“不要在现有文件和目录上应用规则”。您还需要删除RewriteBase /

RewriteEngine On
RewriteRule ^(.+)$ index.php [QSA,L]

文件应位于/suff/.htaccess下。

以下规则也对我有用:

RewriteEngine On
RewriteRule ^ index.php [L]

RewriteEngine On
RewriteRule ^ index.php [END]

关于您的评论:

通常,我将创建一个public文件夹,并将应直接访问的所有内容(public/css/public/jspublic/img等)放入其中。然后将其列入白名单:

RewriteEngine On
RewriteRule ^public/ -  [END] # allow direct access on public folder
RewriteRule ^ index.php [END] # anything else will be directed to index.php

您当然可以用相同的方式将多个目录列入白名单:

RewriteEngine On
RewriteRule ^css/ - [END]
RewriteRule ^img/ - [END]
RewriteRule ^js/  - [END]
RewriteRule ^ index.php [END]

或者类似您在评论中建议的内容:

RewriteRule ^(scripts|styles|morefoldernames)($|/) - [L]

答案 1 :(得分:0)

已经很晚了,所以我的大脑可能对此感到困惑,但是可以肯定的是,您只是希望将东西中的所有内容都重定向到index.php,而不管是不是。

然后,只要URL中包含“ / stuff /”,以下内容就可以使用。我想您也不必担心查询字符串等,如果是这样,则需要将下面的index.php修改为index.php?$ 1,并将标志修改为[QSA,NC,L]。 / p>

RewriteEngine On
RewriteRule ^/stuff/?$  /stuff/index.php [NC,L]

检查您的根.htaccess文件中是否有“ RewriteOptions InheritDown”行,这样就应覆盖每个子文件夹的.htaccess文件。

答案 2 :(得分:0)

尝试一下。

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^/stuff/(.+)$ /stuff/index.php [L]