I am currently developing a website in EE (2.10.3), and everything is working great except one difference between my local version (running on XAMPP) and my staging version on a linux server.
I have written a module that my site makes a call to through ACT id, but this isn't working on the staging site, unless I am currently logged in to the control panel! If I'm not logged in, the request returns a 404 error, with the text "File not found.". If I am logged in, visiting the ACT url will return the correct information.
Just to sanity test that it isn't my module causing the issue, I tried loading a url with some other ACT id, with the same issue. For instance, in my installation, the ACT id for the "Channel" method 'combo_loader' is 4. The url for my local version http://local.example.com/?ACT=4
loads just fine, while the URL for the staging version http://staging.example.com/?ACT=4
returns 'File not found.'! If I log in to the control panel in my staging version, then that url works just fine.
Anyone have any info that can help me debug this?
EDIT: I've narrowed this down a bit. The problem lies in my .htaccess file. Specifically, the section used for Static Cache for the Mustash add-on. If I disable that, things work...
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteBase /
#################################################################################
# START MUSTASH STATIC CACHE RULES
# -------------------------------------------------------------------------------
# default_site
# -------------------------------------------------------------------------------
# Exclude image files
RewriteCond $1 !\.(gif|jpe?g|png|ico)$ [NC]
# We only want GET requests
RewriteCond %{REQUEST_METHOD} GET
# Exclude CSS/ACT EE URLs and 'preview'
RewriteCond %{QUERY_STRING} !^(css|ACT|URL|preview)
# Uncomment this if you want to disable static caching for logged-in users
#RewriteCond %{HTTP_COOKIE} !exp_sessionid [NC]
# Remove index.php from conditions
RewriteCond $1 ^(index.php/)*(.*)(/*)$
# Check if cached index.html exists
RewriteCond /chroot/home/example/staging.example.com/html/_cache/stash/static_cache/1/$2/index.html (.*\.(.*))$
RewriteCond %1 -f
# Rewrite to the cached page
RewriteRule ^(index.php/*)*(.*)(/*) /_cache/stash/static_cache/1/$2/index.%2 [L]
# END MUSTASH STATIC CACHE RULES
#################################################################################
# -------------------------------------------------------------------------------
# Officially supported method to remove index.php from ExpressionEngine URLs
# See: http://ellislab.com/expressionengine/user-guide/urls/remove_index.php.html
# -------------------------------------------------------------------------------
# Removes index.php from ExpressionEngine URLs
RewriteCond %{THE_REQUEST} ^GET.*index\.php [NC]
RewriteCond %{REQUEST_URI} !/system/.* [NC]
RewriteRule (.*?)index\.php/*(.*) /$1$2 [R=301,NE,L]
# Directs all EE web requests through the site index file
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php/$1 [L]
</IfModule>
It's not the last two sections, either. I removed them and the problem persists. The problem only goes away when I remove all that other stuff.