如何使用除1个目录和1个文件之外的htaccess重定向?

时间:2016-11-22 13:31:31

标签: php .htaccess redirect mod-rewrite

这是我的设置。 我有example.com,它有文件和子目录。其中一个文件是maintenance.php,其中一个目录是/ admin。我正在尝试将所有来自example.com的请求重定向到example.com/maintenance.php除了example.com/maintenance.php(不这样做导致错误)和example / admin中的所有页面。 example.com/file1应该重定向到example.com/maintenance.php,example.com/maintenance.php不应该导致任何错误,example.com/admin/file1不应该重定向。

这就是我无法开展的工作:

RewriteEngine On
RewriteCond %{REQUEST_URI} !(.*)admin.*
RewriteCond %{REQUEST_URI} !^/maintenance.php$
RewriteRule .* /maintenance.php [R=302,L]

example.com/admin仍然重定向到example.com/maintenance.php

全部谢谢

2 个答案:

答案 0 :(得分:0)

当您的网站不可用时,切勿使用外部重定向;你需要设置503标题,否则你可能会杀死你的搜索引擎排名。

单独保留任何现有的重写规则,并在所有重写规则之前添加:

RewriteRule ^(?!maintenance\.php$|admin(?:$|/)) maintenance.php [NS,L]

maintenance.php的第一行应该是

<?php
header($_SERVER['SERVER_PROTOCOL'] . ' 503 Service Unavailable');

它仍然可以有内容。

如果您仍然无法进入管理员,您至少可以看到其他网址需要列入白名单。您可能还需要排除media,css和/或js目录。

完成后,请在下次使用#注释掉该规则。

答案 1 :(得分:-1)

确保您的example.com/admin网址不是404 Not Found。当服务器尝试重定向到错误文档时,它将重定向到maintenance.php,因为错误文档未从重定向中排除。为避免这种情况,您可以添加排除错误文档的RewriteCond规则。例如:

RewriteEngine On

#Exclude *admin* and /maintenance.php
RewriteCond %{REQUEST_URI} !.*admin.*
RewriteCond %{REQUEST_URI} !^/maintenance\.php$

#This handles both 404 and 500 Errors
RewriteCond %{REQUEST_URI} !^/path/to/(404|500)\.html$

RewriteRule .* /maintenance.php [R,L]

我也逃脱了路径中的点,因为这样做是很好的做法。 (避免使用maintenanceXphp也不会重定向。)