簡體   English   中英

PHP / Apache自定義文件類型處理

[英]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進行更細粒度的控制,並在需要時可以指定一些其他參數。


上述重寫規則的兩個注意事項:

  • 您可能必須啟用Apaches AllowEncodedSlasheson ,具體取決於您現有的服務器設置
  • 如果要在.htaccess樣式文件中使用重寫規則,則必須稍稍更改語法(必須刪除前導斜線,具體取決於放置該文件的位置)。 但是通常,應盡可能避免使用此類文件:眾所周知,這些文件容易出錯,難以調試,有時會導致意外的副作用並確實使服務器運行緩慢。 因此, 如果您有權訪問服務器主機配置,則應首選在其中放置此類規則。

httpd.confvhost.conf添加以下代碼,然后重新啟動Apache服務器

<IfModule mime_module>
    AddType application/x-httpd-php .phps
</IfModule>

否則你可以使用mod_rewrite

http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html

確定,我明白了,這是我做的:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM