所以我在我的本地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/all
forms的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-Type
标Header
)。
还要注意,使用RewriteRule
上的T
标志来设置mimetypes的“简单”方法在per-directory / .htaccess
上下文中不起作用 – 当重写过程重新开始时,它将被覆盖。