mod_rewrite刚刚破坏了服务器发送的事件内容类型?

时间:2014-11-23 10:49:15

标签: .htaccess mod-rewrite url-rewriting http-headers server-sent-events

我的.htaccess文件中有以下规则:

Options +FollowSymLinks 
RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !(?:\.\w+)$

RewriteRule ^func/(.*)(/.*)?$ includes/function/post/$1.php$2

所以我可以访问:

http://localhost/func/create/?ID=1
(it'll goto http://localhost/includes/function/post/create.php?ID=1)

它工作正常,但如果我在这样的javascript中使用EventSource:

new EventSource('http://localhost/func/create/?ID=' + ID);

然后它会将Accept: text/event-stream添加到请求标题

但我注意到响应标题的内容类型为text/html; charset=iso-8859-1

然后只是给我一个 HTTP 406 Not Acceptable 状态代码,

(如果我在请求标题中删除Accept: text/event-stream,则工作正常)

我确保在我的php源代码中添加了这一行:

header('Content-Type: text/event-stream;');

如果我访问http://localhost/includes/function/post/create.php?ID=1

一切正常,是不是支持EventSource mod_rewrite?

编辑---

我试过了:

<FilesMatch "create.*$">
    ForceType text/event-stream
</FilesMatch>

但它返回HTTP 404 Not Found ..:/

编辑2 ---

所以我只是添加一个新规则来覆盖内容类型:

RewriteRule ^.*/(.*)/create(/.*) includes/function/$1/create.php$2 [T=text/event-stream]

因此,任何以“create”命名的文件都是text/event-stream

我不能将它应用于所有php文件,因为我有其他文件

不应该是text/event-stream的类型,但现在我遇到了一个新问题..

如果我的php出错了......我仍会回复text/event-stream给我..

我会一直指责:D

1 个答案:

答案 0 :(得分:0)

所以我得到了一个临时解决方案,它将内容类型强制为text/event-stream

只需添加此规则:

RewriteRule ^.*/(.*)/create(/.*) includes/function/$1/create.php$2 [T=text/event-stream]

因此,任何以“create”命名的文件都是text/event-stream

但它会导致另一个问题:一旦你的PHP出错,它仍然会为你返回text/event-stream