2014-09-03 105 views
0

我想知道,有沒有辦法可以阻止其他PHP文件在我的服務器上,除了在根文件夾中index.php,這是我所有呼叫重定向到這個文件的執行返回PHP文件以純文本格式,除了指數

RewriteEngine On 

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-l 
RewriteRule ^.*$ index.php [L,NS] 

我不知道什麼樣的-d-f-l單獨做的,我所知道的是,他們允許像的圖像和文件的東西要返回的不是重寫地址index.php爲好。糟糕的是他們允許像site.com/somescript.php這樣的地址也被執行。

我想知道是否有可能禁用在根文件夾中的任何其他PHP文件的執行,但不使它無法訪問,即將其作爲純文本返回?

+0

的 - d/-f/-l表示「如果請求的內容不是現有目錄,現有文件或現有符號鏈接,則在其位置提供index.php。」 – 2014-09-03 15:14:53

回答

1

只需創建一個禁止任何請求在.php結束,除了/index.php另一個重寫規則:

RewriteCond %{REQUEST_URI} !^/index.php$ 
RewriteRule \.php$ - [R=403,L,NC] 

或者,如果你想成爲另一個.php文件爲純文本:

<FilesMatch "\.php$"> 
    RemoveHandler .php 
    php_flag engine off 
</FilesMatch> 
<Files index.php> 
    AddHandler php5-script .php 
    php_flag engine on 
</Files> 
+0

這是我最終要做的,但我希望我可以以純文本形式返回文件,而不是拒絕訪問它? – 2014-09-03 15:39:37

+0

@php_nub_qq添加了一個新的解決方案,應該按照你想要的方式工作。理想情況下,您可以將任何敏感的PHP文件移出公共目錄! – amarcus 2014-09-03 15:58:12

0

此問題的典型解決方案是將所有PHP代碼(index.php除外)移到DOCUMENT_ROOT dirrectory之外,以便Apache無法看到它們。比如,你現在有:

/path/to/site.com 
    index.php 
    other1.php 
    other2.php 

理想情況下,你想要的東西,如:

/path/to/site.com/public 
    index.php 

/path/to/site.com/lib 
    other1.php 
    other2.php 

然後在你的Apache配置,你點/path/to/site.com/public,而不是/路徑/到/ site.com。這樣,您的庫文件對Apache不可見,不能直接請求。請注意,這可能需要對代碼進行一些更改,因爲現在您的包含已經移動了,但這可能只需通過更改include_path即可完成。

+0

是的,這是我的。但我想明確禁止在公共目錄中執行其他的PHP腳本,儘管我沒有任何其他的。 – 2014-09-03 15:20:07