我們將.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-name
,proj-name
和docname
並從正確的文件夾提供它:
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]
我認爲什麼是應該做的是:
- 如果
http://mydomain.com/_docu/clients/$1/$2/$3.pdf
不存在, - 頁轉到頁
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(不定期的學習機會)。
*幾乎*作品...在第二組(在「#等檢查」後),前3行工作,如果最後一行被禁用。同樣,如果先行3行被禁用,最後一行將起作用。但是,所有4行啓用導致內部服務器錯誤。 (PS我怎麼'@'你?) – gibberish
@gibberish(如果你評論我的帖子,你不需要'@'我)最後一條規則總是要抓住所有東西。我不確定爲什麼它在那裏。你是否試圖說如果以前的規則(用於PDF的規則)不匹配,則返回404錯誤? –
嗨喬恩,那也不是很好。現在即使是合法網頁也會直接進入404.php頁面。我將更新OP來顯示我當前的htaccess。 – gibberish