.htaccess删除php文件扩展名不工作只在heroku上

所以我在我的本地apache XAMPP服务器在根目录中的.htaccess文件中的下面的代码,它正常工作100%。 但是,当我尝试部署到Heroku时,它不起作用。 我已经尝试了在互联网上发现稍微修改版本执行相同的事情,但没有一个似乎工作。 这应该是删除.php文件的扩展名,并允许像/api/products/all文件api.php存在和products/all只读入PHP $_SERVER['PATH_INFO']和输出是基于它们是什么。

 Options +MultiViews RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^([^\.]+)$ $1.php [NC,L] 

我不知道有关.htaccess吨,所以任何帮助,将不胜感激。

这应该是删除.php文件的扩展名

那么,严格来说,这段代码是为了再次添加 .php文件扩展名(为了路由URL)。 (您已经通过发出/api/products/all的请求来“移除”它。)

但是,这段代码并没有做你认为正在做的事情。 由于MultiViews行(mod_negotiation的一部分),这只能在本地服务器上运行。 下面的mod_rewrite代码根本就没有做任何事情,这也可能是为什么在Heroku上这不适合你呢?

如果允许mod_rewrite指令运行(即,如果MultiViews禁用 ),那么这将重写/api/products/all/api/products/all.php ,这在本例中显然是不正确的。

我不知道你想要处理的URL格式是什么,但是要使用mod_rewrite专门将一个/api/products/allforms的URL路由到/api.php/products/all ,你需要类似下面的内容:

 RewriteEngine On RewriteRule ^(api)/(.+) $1.php/$2 [L] 

如果您只匹配这个特定的URL,则不需要RewriteCond指令。

…和“产品/所有”只是用PHP读入

这被称为额外的path名信息 ,由服务器pipe理/收集,并传递到$_SERVER超全局的PATH_INFO元素中的PHP。 是否允许path信息完全取决于服务器。 (如果没有,那么这样的URL将导致404)

更新#1:

…如果我也有像example.js.php这样的文件(我使用php代码,但是把它们呈现为javascript文件),我想把它们的.php文件去掉,这样就可以通过example.js来访问它们了。我修改重写规则?

您可以添加一个额外的规则块,如下所示:

 RewriteCond %{DOCUMENT_ROOT}/$1.$2.php -f RewriteRule (.+)\.(js)$ $1.$2.php [L] 

这将拦截对.js文件的所有请求,并将请求重写为对应的.js.php文件(如果存在)。

或者,您可以像这样指定RewriteCond指令:

 RewriteCond %{REQUEST_FILENAME}.php -f 

请注意,如果您的.js文件也位于启动/api/的URLpath下,那么此规则将需要在上述传送api调用的规则之前执行,以避免冲突。

更新#2:您可能还需要为这些资源设置正确的MIMEtypes。 (不pipe它是否工作与错误的MIMEtypes是依赖于浏览器。)由于.js URL被内部重写为一个PHP脚本(即.js.php ),Apache自然会用text/html mime-键入(如默认所有PHP文件一样)。 您可以确保从脚本中明确设置了正确的Content-Type标头,或者使用Header指令(mod_headers)将其设置为.htaccess 。 例如:

 <FilesMatch "\.js.php$"> Header set Content-Type "application/javascript; charset=UTF-8" </FilesMatch> 

请注意,这只适用于Apache 2.2.12+(在此版本之前,无法使用Header指令设置Content-TypeHeader )。

还要注意,使用RewriteRule上的T标志来设置mimetypes的“简单”方法在per-directory / .htaccess上下文中不起作用 – 当重写过程重新开始时,它将被覆盖。