htaccess将实际目录路径重写为不同的,不存在的url,隐藏真实路径

时间:2012-10-02 01:07:16

标签: apache .htaccess mod-rewrite redirect

我想使用像___test这样的目录/___test/subdirectory1/并拥有一些内容,但绝不会在网址中显示此路径。相反,我希望网址/demo/subdirectory1或说/demo/subdirectory1/images/image.jpg指向/___test/subdirectory1/images/image.jpg,并且浏览器上的网址保持为:/demo/subdirectory1/images/image.jpg。实际上将___test替换为demo

我尝试过各种各样的问题虽然它看起来有时有效但是:

RewriteRule ^demo/subdirectory1(.*) ___test/subdirectory1/$1

以上内容仅适用于:demo/subdirectory1demo/subdirectory1/(现有内容示例中的/___test/subdirectory1/内部为index.html)但demo/subdirectory1/somethingmore...上没有,但内容位于/___test在这种情况下,不幸的是它显示了URL中的真实目录路径。

此外,我使用以下内容通过404到网址中RewriteCond %{THE_REQUEST} ^GET\ /___test/ RewriteRule ^___test/(.*) - [R=404,L,NC] 开头的任何内容:

/___test/subdirectory1/.htaccess

它有效,但是当我添加它时,不幸的是(之后),之前也进入了404。 但对我来说最重要的是使第一部分正确,即使我从未做过第二部分工作。

任何帮助真的很感激。 感谢。

编辑1: 我还尝试在Options +FollowSymLinks RewriteEngine On RewriteBase /___test/subdirectory1

中添加以下内容
RewriteCond %{REQUEST_URI} ^/demo/subdirectory1(.*)
RewriteCond %{DOCUMENT_ROOT}/___test/subdirectory1/%1 -f [OR]
RewriteCond %{DOCUMENT_ROOT}/___test/subdirectory1/%1 -d
RewriteRule ^ /___test/subdirectory1/%1 [L]

没有成功。

编辑2: 虽然效果不好,但迄今为止我在Jon Lin的帮助下提出的最好成绩如下:

/demo/subdirectory1

/demo/subdirectory1/< - 确定

/demo/subdirectory1/subdirectory2< - 确定

/demo/subdirectory1/subdirectory2/< - 公开真实路径

/demo/subdirectory1/subdirectory2/subdirectory3< - 确定

/demo/subdirectory1/subdirectory2/subdirectory3/< - 公开真实路径

subdirectory1< - 确定

正如您所看到的,任何比{{1}}更深层次的问题都存在问题。我只是无法理解为什么。在linux apache上的站点根目录中存在的干净.htaccess文件(没有其他更深层次)上进行测试。

1 个答案:

答案 0 :(得分:0)

在大多数情况下,您处于正确的轨道,但您可能需要添加几项检查,以便不会公开__test目录:

RewriteEngine On

# prevent mod_dir from redirecting to trailing slash
RewriteCond %{REQUEST_URI} ^/demo/subdirectory1/(.*[^/])
RewriteCond %{DOCUMENT_ROOT}/___test/subdirectory1/%1 -d    
RewriteRule ^ /demo/subdirectory1/%1/ [L,R=301]

RewriteCond %{REQUEST_URI} ^/demo/subdirectory1$
RewriteRule ^ /demo/subdirectory1/ [L,R=301]


# check if the file actually exists first
RewriteCond %{REQUEST_URI} ^/demo/subdirectory1/(.*)
RewriteCond %{DOCUMENT_ROOT}/___test/subdirectory1/%1 -f [OR]
RewriteCond %{DOCUMENT_ROOT}/___test/subdirectory1/%1 -d

# and rewrite only if the resource exists within ___test
RewriteRule ^ /___test/subdirectory1/%1 [L]

使用[L]确保您已在当前迭代中结束重写。

您的404规则应该有效,但您应该删除尾部斜杠,以便mod_dir不会尝试重定向并公开___test目录:

RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /___test
RewriteRule ^ - [R=404,L,NC]