2011-04-24 109 views
5

我目前使用mod_rewrite做一个内部重定向的mod_rewrite:允许重定向,但避免直接访问

RewriteCond %{REQUEST_URI} ^/pattern$ 
RewriteRUle .* file.php 

不过,我想,以防止file.php直接访问通过将请求重定向到该文件未找到页面URL 。

RewriteCond %{REQUEST_URI} /file.php 
RewriteRule .* page-not-found.php 

的问题是,当我做的第一重定向,因此打破了我的第一个内部重定向的第二条规则也同样适用。

[Q]有没有办法允许第一次重定向,但阻止直接访问重定向文件?

回答

6

编辑:(这在目前的形式但似乎没有对我的工作 - 它看起来像第二条规则被应用于反正)通过@ AndrewR的回答启发的.htaccess只是一个工作的解决方案密钥。

如果遇到有效模式,请将密钥添加到查询字符串中。

然后在决定页面重定向时测试该密钥。

RewriteEngine on 
Options +FollowSymlinks 

RewriteCond %{REQUEST_URI} ^/pattern$ 
RewriteRule .* /file.php?SUPER_SEKRIT_KEY [QSA] 

RewriteCond %{QUERY_STRING} !SUPER_SEKRIT_KEY 
RewriteCond %{REQUEST_URI} /file.php 
RewriteRule .* /test/page-not-found.php [L,F] 

当然使用一个更复杂的键,并且只对内部重定向!否则,用户将能够获取密钥。

+1

而不是秘密密钥环境变量与t他的E标签可能会更少干扰(不会改变QUERY_STRING,稍后可能会使用) – regilero 2011-07-17 20:34:34

+0

@regilero您能举个简短的例子吗? – Etherealone 2012-08-16 21:48:48

+0

我认为@regilero的含义类似于“RewriteRule。* - [E = key:SEKRITVALUE]”,后面是%{ENV:key}上的RewriteCond测试。但是,我不能得到那个工作... – 2015-01-16 15:43:57

2

您可以在重写规则末尾添加一个[L],表示Last,或者不再进行处理。这只能在Apache配置中使用。它在.htaccess文件中不起作用。

RewriteEngine On 

RewriteCond %{REQUEST_URI} pattern$ 
RewriteRule .* /file.php [L] 

RewriteCond %{REQUEST_URI} file.php$ 
RewriteRule .* /page-not-found.php [L] 
+0

这不会阻止访问'file.php'? – 2011-04-24 08:24:50

+0

我只以一个重写规则为例。为了清晰,我添加了第二个。他们都是必需的。 – AndrewR 2011-04-24 08:28:26

+0

嗯,我无法得到这个工作在我的Apache 2.你确定这可以工作? – 2011-04-24 09:07:31

2

一个简单的方法来做到这一点只使用.htaccess。

将您file.php到一个名为securedir新目录。在根目录下使用这个.htaccess文件。

RewriteEngine On 
RewriteRule ^pattern$ securedir/file.php 

阻止访问在securedir有这样的东西在.htaccess文件存在。 (或者引导他们回不同的页面,如果你喜欢。)

deny from all 
+0

谢谢。您在“否认所有”之前为了.htaccess理解它与securedir目录相关的内容是什么? – Max 2011-04-24 10:10:07

+0

没有别的。它进入它自己的.htaccess文件里面的securedir。 – AndrewR 2011-04-24 10:39:27

7

使用ENV:REDIRECT_STATUS变量(见mromainecontribution"Hidden features of mod_rewrite" community wiki

RewriteCond %{REQUEST_URI} ^/pattern$ 
RewriteRule .* file.php 

# Redirect direct access to file.php 
RewriteCond %{REQUEST_URI} /file.php 
RewriteCond %{ENV:REDIRECT_STATUS} ^$ 
RewriteRule .* page-not-found.php 

测试用例:

每个HTTP响应是HTTP 200

+0

对于'RewriteCond%{REQUEST_URI}/file.php'+1'RewriteCond%{ENV:REDIRECT_STATUS}^$'这为我解决了一个问题。谢谢! – insaner 2014-09-02 18:52:09

+0

每个客户端会话是否存储环境?我的意思是像上面一样使用它们是安全的,而多个请求可能同时到达? – Farzan 2015-07-01 13:10:32

+0

我认为环境变量是每个请求,尤其是这个('ENV:REDIRECT_STATUS'),它由内部Apache进程填充。 – CDuv 2015-09-02 15:10:25