是否有可能在进入子目录之前强制apache服务器读取root htaccess?

时间:2015-04-24 13:22:45

标签: apache mod-rewrite

我在root中有一个子目录(我们称之为/sub)和.htaccess。如果我调用以下URL:mywebsite.com/sub,我会直接进入子目录,省略root中的.htaccess,所以我想问一下是否可以强制服务器先读取root .htaccess到子目录(并在需要时进行相应的重定向)?

提前致谢

编辑:我发现我的重定向明确排除了不需要的目录(似乎是我问题的根源):

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*) http://redirectwebsite.com/$1 [R=301,L]

我删除了第二行,但不幸的是我仍然进入我的文件夹。

所以说清楚:

  • 当我转到http://mywebsite.com/not-a-folder-in-root时,我被正确地重定向到新网站
  • 当我转到http://mywebsite.com/a-folder-in-root时,我没有被重定向,而是转到我的子文件夹index.php

后者是我想要消除的行为。

1 个答案:

答案 0 :(得分:1)

这取决于你需要做什么。首先.htaccess文件按找到它们的顺序读取。

How directives are read

  

应用.htaccess文件中的配置指令   找到.htaccess文件的目录,以及所有目录   子目录。但是,重要的是要记住这一点   目录中可能存在.htaccess文件。   指令按照找到的顺序应用。因此,一个   特定目录中的.htaccess文件可能会覆盖找到的指令   在.htaccess文件中找到更高的目录树。以及那些,   反过来,可能已经被覆盖的指令发现更高,或者在   主服务器配置文件本身。

因此htaccess文件将始终覆盖根目录中的文件。但是,您可以操作Apache配置文件并在Location指令中指定指令。您可以指定某些规则,然后它将影响.htaccess规则。请参阅以下信息。

  

正如配置章节文档中所述,.htaccess   文件可以覆盖相应的部分   目录,但将被其他类型的配置覆盖   主配置文件中的部分。这个事实可以用来   即使在自由主义者面前,也要强制执行某些配置   AllowOverride设置。例如,防止脚本执行   允许在.htaccess中设置任何其他内容,您可以使用:

<Directory "/www/htdocs">
    AllowOverride All
</Directory>

<Location "/">
    Options +IncludesNoExec -ExecCGI
</Location>

否则,如果由于您无权访问而无法进行更改,则必须执行root .htaccess文件中与子文件夹相关的所有规则。你可以做而不是将.htaccess放在sub文件夹中。

根据评论进行修改

#just use this for all requests
RewriteRule (.*) http://redirectwebsite.com/$1 [R=301,L]

#Or you can do all non-existent folders and that sub folder too
RewriteCond %{REQUEST_URI} ^/sub [NC]
RewriteCond %{REQUEST_FILENAME} -d [OR]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*) http://redirectwebsite.com/$1 [R=301,L]