Home » Php » apache – ForceType/htaccess file extension question – extensionless files?

apache – ForceType/htaccess file extension question – extensionless files?

Posted by: admin July 12, 2020 Leave a comment

Questions:

This is my .htaccess file:

<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>

The above code somehow works, but I’m not sure why though… I expected a 500 error. I’m OK at .htaccess, but mainly for things like blocking robots/spiders etc. rather than filetypes. The top of the file is meant for custom php.ini files (I was trying to replicate on my own Apache server as if I had no access to the proper php.ini file, like they do on web hosting companies’ sites, just for added realism on my testing sites).

Although I understand how to use ForceType and SetHandler, I’m not sure how to use it for extensionless files (e.g. if I had a file called testing1, I could run it as php).

Previously I did it this way:

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

but it became tedious doing it for every single extensionless file.

Basically, what I’m trying to do is to ensure that I have extensionless files via the ForceType/SetHandler directives, but is it possible? (and is the symbol above in my first example the wildcard one, or not?)

Thanks

How to&Answers:

DefaultType has been removed in Apache 2.4. Your best option is the following:

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

This will catch all files without an extension and process them as PHP. Then all files with an extension will be processed as normal.

Using mod_mime_magic is not a good choice as each file will need to be checked each time. See the mod_mime_magic docs for more info.

Answer:

For Apache 2.3 and older, just change the DefaultType as follows:

DefaultType text/html

This way, every non-recognized file (including files without an extension) will be treated as HTML.


For Apache 2.4 and up, see Tigger’s answer.

Answer:

Extensionless files only

This solution affects only extensionless, statically served files: (credit Eugene Kerner)

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

Any unknown content

This one affects any response that would otherwise be transmitted without a Content-Type header. In other words, it mimics the behaviour of the old DefaultType directive:

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

It should be possible to use setifempty here instead of the -z expression. But it fails and overwrites the header in every response, empty or not. I don’t know why. Eric Covener says it’s because the Content-Type header isn’t added “until the very last second”.

Old servers only

This will fail after upgrading to 2.4: (see the manual)

DefaultType application/x-httpd-php

Answer:

I spent ages trying to resolve a similar issue where ForceType and DefaultType wouldn’t work on some pages.

I found the same answer as kbk. Edit /etc/httpd/conf/httpd.conf and comment the lines for the Mime Magic Module:

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

After that, restart Apache.

You can find more information here: http://realtechtalk.com/HTML_files_in_Apache_still_displaying_as_raw_text_even_with_DefaultType_ForceType_etc-1752-articles

Answer:

(1) Modify .htaccess or apache2.conf or httpd.conf

Source:

Add:
DefaultType application/octet-stream

Remove if present:
DefaultType text/plain

Restart apache

(2) Enable mime_magic

Sources:

Enable mime_magic
$ sudo a2enmod
-> mime_magic

$ sudo /etc/init.d/apache2 restart

Disable a module:

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