[英]PHP/Apache custom file type handling
我想知道是否可以為Apache創建由PHP文件處理的自定義文件類型處理。
我要完成的工作是創建一種自定義.phps
擴展名,以在瀏覽器中查看代碼。
我正在使用CodeMirror來顯示代碼,但我希望此過程是自動化的,因為我只是將.php
擴展名更改為.phps
,而其他一些.php
文件將處理該.phps
文件,因此我可以注入的所述源代碼.phps
文件與CodeMirror一個HTML文件。
我希望我的目標很明確,我只是想知道是否有可能。
編輯:
需要澄清的是-我想將此規則設置為從apache.conf運行,這意味着它將在所有虛擬主機等上運行,而不是在服務器上每個目錄中都需要的.htaccess
文件中運行。
我認為這應該與apache.conf中的FilesMatch
一起使用,現在這就是我要修改的內容:
<FilesMatch "\.phps$">
SetHandler application/x-httpd-php
RewriteEngine on
RewriteRule ^(.*)$ /tools/code/?file=$1 [L]
</FilesMatch>
但是,我收到一個400 Bad Request
錯誤。 我想在這樣的基礎上進行構建,以便Apache可以從其配置中處理.phps
文件,而不必在服務器上的每個目錄中使用.htaccess
文件。
當然可以,只需看一下文檔即可。 很好地解釋了文件類型處理程序的工作方式,請看一下AddType
命令。 但是,這是否是實現目標的可視化php源代碼的好方法,這值得懷疑。 使用重寫將請求的文件移交給可以隨心所欲地“發布”該文件的處理程序腳本,難道不是容易得多,更優雅嗎?
例如,您可以使用以下URL並在內部對其進行重寫:
/source/path/to/file.php => /path/to/handler.php?source=%2Fpath%2Fto%2Ffile.php
這可以通過apache重寫模塊或在nginx中使用常規處理程序腳本來完成:
RewriteEngine on
RewriteRule ^/source/(.)*$ /path/to/handler.php?source=$1 [L,B]
這樣,您不必定義某些本地文件類型,而可以命名php文件以使其按實際顯示的名稱:php文件。 我的意思是一個php文件是一個php文件。 文件擴展名應該反映文件中所包含內容的類型,而不是應該如何處理。 這意味着您需要混合不同的邏輯層。
在我看來,這對用戶而言更加透明。 此外,它還允許對要重寫的URL進行更細粒度的控制,並在需要時可以指定一些其他參數。
上述重寫規則的兩個注意事項:
AllowEncodedSlashes
到on
,具體取決於您現有的服務器設置 .htaccess
樣式文件中使用重寫規則,則必須稍稍更改語法(必須刪除前導斜線,具體取決於放置該文件的位置)。 但是通常,應盡可能避免使用此類文件:眾所周知,這些文件容易出錯,難以調試,有時會導致意外的副作用並確實使服務器運行緩慢。 因此, 如果您有權訪問服務器主機配置,則應首選在其中放置此類規則。 在httpd.conf
或vhost.conf
添加以下代碼,然后重新啟動Apache服務器
<IfModule mime_module>
AddType application/x-httpd-php .phps
</IfModule>
否則你可以使用mod_rewrite
確定,我明白了,這是我做的:
在apache.conf
我添加了以下內容:
<FilesMatch "\.phps$">
SetHandler application/x-httpd-php
RewriteEngine On
RewriteRule ^(.*)$ /tools/code/index.php [QSA,L]
</FilesMatch>
/tools/
目錄被添加為別名
Alias /tools "C:/Web/httpdocs/tools/"
這足以將定義的index.php
文件用作“處理程序”。
我使用Ace編輯器顯示代碼。 為了加載.phps
文件以在編輯器中查看,我在編輯器文件中添加了一個不可見的<textarea>
元素,並在其中加載了源:
<textarea id="code" style="display:none;">
<?=file_get_contents(ltrim($_SERVER['DOCUMENT_ROOT'], '/').$_SERVER['REQUEST_URI']);?>
</textarea>
我修改了初始化代碼以滿足自己的需求:
<script>
var editor = ace.edit('editor');
editor.session.setMode('ace/mode/php');
editor.setTheme('ace/theme/monokai');
editor.setValue(document.getElementById('code').value);
editor.gotoLine(1);
editor.setShowPrintMargin(false);
editor.setReadOnly(true);
</script>
瞧,我有一種更高級的查看.phps
文件的方式。 感謝您幫助我步入正軌。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.