Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ForceType/htaccess file extension question - extensionless files?

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

like image 503
whitstone86 Avatar asked Jan 19 '11 20:01

whitstone86


3 Answers

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
like image 32
Michael Allan Avatar answered Oct 14 '22 13:10

Michael Allan


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.

like image 169
Tigger Avatar answered Oct 14 '22 13:10

Tigger


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.

like image 22
Mathias Bynens Avatar answered Oct 14 '22 14:10

Mathias Bynens