【问题标题】:ForceType/htaccess file extension question - extensionless files?ForceType/htaccess 文件扩展名问题 - 无扩展名文件?
【发布时间】:2011-01-19 20:52:16
【问题描述】:

这是我的 .htaccess 文件:

<IfModule php4/5.c>
php_admin_flag Option
php_flag Option
php_admin_value Option
php_value Option
</IfModule>  
<Files .>
ForceType application/x-httpd-php
SetHandler application/x-httpd-php
</Files>

上面的代码以某种方式工作,但我不确定为什么......我预计会出现 500 错误。我对 .htaccess 没问题,但主要用于阻止机器人/蜘蛛等而不是文件类型。该文件的顶部用于自定义 php.ini 文件(我试图在我自己的 Apache 服务器上进行复制,就好像我无法访问正确的 php.ini 文件一样,就像他们在网络托管公司的网站上所做的那样,只是为了在我的测试站点上增加了真实感)。

虽然我了解如何使用 ForceType 和 SetHandler,但我不确定如何将其用于无扩展名文件(例如,如果我有一个名为 testing1 的文件,我可以将其作为 php 运行)。

以前我是这样做的:

<Files testing1>
ForceType application/x-httpd-php
SetHandler application/x-httpd-php
</Files>

但是对每个无扩展名的文件都这样做很乏味。

基本上,我要做的是通过 ForceType/SetHandler 指令确保我拥有无扩展名的文件,但这可能吗? (在我的第一个示例中,上面的符号是通配符吗?)

谢谢

【问题讨论】:

    标签: apache .htaccess php


    【解决方案1】:

    DefaultType 已在 Apache 2.4 中删除。您的最佳选择如下:

    <Files *>
        ForceType application/x-httpd-php
    </Files>
    <Files *\.*>
        ForceType None
    </Files>
    

    这将捕获所有没有扩展名的文件并将它们作为 PHP 处理。然后所有带有扩展名的文件都会被正常处理。

    使用mod_mime_magic 不是一个好的选择,因为每次都需要检查每个文件。请参阅mod_mime_magic docs 了解更多信息。

    【讨论】:

    • 请记住,如果您的网站具有用户可以上传文件的功能,那么它可能会导致用户上传的文件以 PHP 执行,然后您知道... BOOOOOM。
    • 任何人如果在没有正确检查上传文件的内容的情况下允许上传文件,无论如何都是自找麻烦。
    • 没错,但将其作为警告作为答案可能不是坏主意,因为我们知道很少有人会继续复制粘贴它。
    【解决方案2】:

    对于 Apache 2.3 及更早版本,只需将 DefaultType 更改如下:

    DefaultType text/html
    

    这样,每个无法识别的文件(包括没有扩展名的文件)都将被视为 HTML。


    对于 Apache 2.4 及更高版本,请参阅 Tigger’s answer

    【讨论】:

    • DefaultType 已在Apache 2.4 中删除(嗯,技术上仍然存在,但除了警告之外什么都不做)。
    • @Tigger 不错!编辑了我的答案。
    【解决方案3】:

    仅限无扩展名的文件

    此解决方案仅影响无扩展名、静态提供的文件:(信用 Eugene Kerner

    <FilesMatch "^[^.]+$">
        ForceType application/x-httpd-php
        </FilesMatch>
    

    任何未知内容

    这会影响任何在没有Content-Type 标头的情况下传输的响应。换句话说,它模仿了旧的DefaultType 指令的行为:

    Header set Content-Type "application/x-httpd-php" "expr=-z %{CONTENT_TYPE}"
    

    这里应该可以使用setifempty 而不是-z 表达式。但它失败并覆盖每个响应中的标头,无论是否为空。我不知道为什么。 Eric Covener 说这是因为“直到最后一秒”才添加 Content-Type 标头。

    仅限旧服务器

    升级到 2.4 后会失败:(参见manual

    DefaultType application/x-httpd-php
    

    【讨论】:

      【解决方案4】:

      我花了很长时间试图解决 ForceType 和 DefaultType 在某些页面上不起作用的类似问题。

      我找到了与 kbk 相同的答案。编辑 /etc/httpd/conf/httpd.conf 并注释 Mime Magic Module 的行:

      <IfModule mod_mime_magic.c>
      #   MIMEMagicFile /usr/share/magic.mime
      #    MIMEMagicFile conf/magic
      </IfModule>
      

      之后,重新启动 Apache。

      您可以在这里找到更多信息:http://realtechtalk.com/HTML_files_in_Apache_still_displaying_as_raw_text_even_with_DefaultType_ForceType_etc-1752-articles

      【讨论】:

        【解决方案5】:

        (1)修改.htaccess或apache2.conf或httpd.conf

        来源:

        添加: DefaultType application/octet-stream

        如果存在则删除: DefaultType text/plain

        重启apache

        (2) 启用 mime_magic

        来源:

        启用 mime_magic $ sudo a2enmod -> mime_magic

        $ sudo /etc/init.d/apache2 restart
        

        禁用模块:

        $ sudo a2dismod
        -> mime_magic
        $ sudo /etc/init.d/apache2 restart
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-02-16
          • 1970-01-01
          • 2019-01-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-09-16
          相关资源
          最近更新 更多