2012-09-16 67 views
0

我們將.htaccess與定位標記結合使用來提供文件並隱藏服務器目錄結構。.htaccess如果文件不存在,則執行其他操作

RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.*)$ /_docu/clients/$1/$2/$3.pdf [NC,L] 

例如,所有的文件都存儲在/public_html/_docu/clients/和文件夾內的所有列出的客戶端,然後在每個客戶自己的項目。但是,對於文件中的錨標記只會讀:

http://mydomain.com/client-name/proj-name/docname.pdf

(中/ _docu /客戶/省略 - 有一個很好的理由)。以上的.htaccess抓住client-nameproj-namedocname並從正確的文件夾提供它:

http://mydomain.com/_docu/clients/client-name/proj-name/docname.pdf

,而在地址欄保留不正確的(隱藏)的目錄結構。

我希望處理不存在的文檔的錯誤條件。這不應該發生,但它可以。任何人都可以提出處理這個問題的方法嗎?可以在功能上類似於「if fileexist($ 1/$ 2 /%3.pdf)」以某種方式構建在.htaccess文件中嗎?


編輯:

如下需要研究和實驗JL的回答延遲反應。謝謝,喬恩,爲了在正確的方向上進行溫柔的推動,但是我還沒有完成它的工作。下面是我的嘗試:

RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
# check if the requested file exists in the "_docu/clients" directory 
RewriteCond %{DOCUMENT_ROOT}/_docu/clients/$1/$2/$3.pdf -f 
RewriteRule ^([a-z0-9])/([a-z0-9])/([a-z0-9]*).pdf$ /_docu/clients/$1/$2/$3.pdf [NC,L] 
RewriteRule ^(.*)$ /errors/404.php [L] 

認爲什麼是應該做的是:

  1. 如果http://mydomain.com/_docu/clients/$1/$2/$3.pdf不存在,
  2. 頁轉到頁http://mydomain.com/errors/404.php

實際的結果是一個「內部服務器錯誤」消息。


編輯兩個:

最新變化:

RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_URI} ^/([a-z0-9])/([a-z0-9])/([a-z0-9]*).pdf$ 
RewriteCond %{DOCUMENT_ROOT}/_data/cli/%1/%2/%3.pdf -f 
RewriteRule ^([a-z0-9])/([a-z0-9])/([a-z0-9]*).pdf$ /_data/cli/$1/$2/$3.pdf [NC,L] 
RewriteCond %{ENV:REDIRECT_STATUS} !200 
RewriteRule ^(.*)$ /metshare/404.php [L] 

與這一個問題是,合法的網頁也被定向到404.php

消息,未來的讀者:

Jon Lin的最終答案解決了上述所有問題。在發現問題時,他修改了答案,直到它成爲完美的工作解決方案。我現在離開了上述情況,因爲對於那些想要比較版本的人來說,有一些很好的ULO(不定期的學習機會)。

回答

1

您需要使用像這樣的情況:

RewriteCond %{DOCUMENT_ROOT}/_docu/clients%{REQUEST_URI} -f 

讓你的規則看起來ssomething像:

RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
# check if the requested file exists in the "_docu/clients" directory 
RewriteCond %{DOCUMENT_ROOT}/_docu/clients%{REQUEST_URI} -f 
RewriteRule^/_docu/clients%{REQUEST_URI} [L] 

編輯:應對問題編輯

你不能這樣做:

RewriteCond %{DOCUMENT_ROOT}/_docu/clients/$1/$2/$3.pdf -f 

由於$ 1/$ 2/$ 3的反向引用尚不存在,因此它們在您的RewriteRule中的分組中匹配,此時尚未發生。但你可以嘗試這樣的事:

RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
# check if the requested file exists in the "_docu/clients" directory 
RewriteCond %{REQUEST_URI} ^/([a-z0-9])/([a-z0-9])/([a-z0-9]*).pdf$ 
RewriteCond %{DOCUMENT_ROOT}/_docu/clients/%1/%2/%3.pdf -f 
RewriteRule ^([a-z0-9])/([a-z0-9])/([a-z0-9]*).pdf$ /_docu/clients/$1/$2/$3.pdf [NC,L] 

RewriteCond %{ENV:REDIRECT_STATUS} !200 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.*)$ /errors/404.php [L] 

在以前RewriteCond基本上是建立打擊%{REQUEST_URI}匹配,則使用%N反向引用下面的RewriteCond

+0

*幾乎*作品...在第二組(在「#等檢查」後),前3行工作,如果最後一行被禁用。同樣,如果先行3行被禁用,最後一行將起作用。但是,所有4行啓用導致內部服務器錯誤。 (PS我怎麼'@'你?) – gibberish

+0

@gibberish(如果你評論我的帖子,你不需要'@'我)最後一條規則總是要抓住所有東西。我不確定爲什麼它在那裏。你是否試圖說如果以前的規則(用於PDF的規則)不匹配,則返回404錯誤? –

+0

嗨喬恩,那也不是很好。現在即使是合法網頁也會直接進入404.php頁面。我將更新OP來顯示我當前的htaccess。 – gibberish

相關問題