2011-04-24 101 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