mod_rewrite:允许重定向但阻止直接访问

Max*_*Max 6 apache mod-rewrite redirect

我目前正在使用mod_rewrite进行内部重定向

RewriteCond  %{REQUEST_URI}  ^/pattern$
RewriteRUle .* file.php
Run Code Online (Sandbox Code Playgroud)

但是,我想file.php通过将对该文件的请求重定向到未找到页面的URL 来阻止直接访问.

RewriteCond %{REQUEST_URI} /file.php
RewriteRule .* page-not-found.php
Run Code Online (Sandbox Code Playgroud)

问题是,当我执行第一次重定向时,第二条规则也适用,因此会破坏我的第一个内部重定向.

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

CDu*_*Duv 9

使用ENV:REDIRECT_STATUS变量(参见mromaine"mod_rewrite的隐藏功能"社区维基贡献:

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
Run Code Online (Sandbox Code Playgroud)

测试用例:

每个HTTP响应都是HTTP 200.


Pek*_*ica 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]
Run Code Online (Sandbox Code Playgroud)

当然,使用更复杂的密钥,仅用于内部重定向!否则,用户将能够获取密钥.