mod_rewrite:隐藏真实的网址,但保持可用的不同文件

时间:2014-06-12 09:15:42

标签: apache mod-rewrite url-rewriting

可能这个问题已经得到解答,但经过数小时的搜索后我没有找到任何答案。

我需要将网站置于"维护模式"并重定向/重写所有对site_down.html的请求,但同时如果我输入文件在子文件夹中的地址,我需要该网站可用。

例如:

如果我输入http://example.com/login.php,我需要显示site_down.html。 但如果我指定http://example.com/test/login.php,我需要显示真实的login.php。

我需要通过重写来完成,因此将所有内容复制到另一个目录并不是一个解决方案。

我尝试了几十种组合,但我仍然无法实现我的需求

这是我的.htaccess文件的一个版本():

DirectoryIndex site_down.html
<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteRule ^test\/(.*)$ $1 [S=1]
    RewriteRule ^(.*\.php)$ site_down.html
    RewriteRule .* - [L]
</IfModule>

此代码应使用&#34; test / *&#34;重写所有请求。到&#34;父文件夹&#34;并跳过下一个重写规则,然后在RewriteRule .* - [L]终止重写。如果没有&#34; test /&#34;在url中 - 所有请求都应该重写为site_down.html

我做错了什么?

你能建议任何有效的解决方案吗?

谢谢。

1 个答案:

答案 0 :(得分:1)

基本上,您正在搜索2条规则。一条规则会将虚拟子目录转换为工作文件。另一个规则将url转换为工作文件到splash页面。我们必须确保如果第一条规则匹配,则第二条规则不匹配。我们可以通过确保" /test/"(包括那个前导空格)不在THE_REQUEST(或客户端发送到服务器请求页面的字符串; {{1 }})。 THE_REQUEST在重写时不会改变,这使得它非常适合。像你一样跳过规则通常没有你期望的效果,因为mod_rewrite通过.htaccess进行多次传递,直到结果url不再更改,或者它达到限制并抛出错误。它第一次跳过规则,但第二次不会这样做。

GET /test/mypage.php?apes=bananas HTTP/1.1