Mod rewrite 将URL从.json重写为.php

Mod rewrite 将URL从.json重写为.php,mod-rewrite,Mod Rewrite,我想要http://server/path/app.json?a=foo&b=bar映射到http://server/path/foo.php?a=foo&b=bar使用mod\u rewrite。我的.htaccess中有以下咒语,它不会给我带来任何快乐 RewriteEngine On RewriteRule ^([^.?]+).json(.*)$ $1.php$2 [L] 建议 更新:添加rewrite.log和error.log输出(注释不允许格式化) 我在rewrite.log中得到

我想要
http://server/path/app.json?a=foo&b=bar
映射到
http://server/path/foo.php?a=foo&b=bar
使用
mod\u rewrite
。我的.htaccess中有以下咒语,它不会给我带来任何快乐

RewriteEngine On
RewriteRule ^([^.?]+).json(.*)$ $1.php$2 [L]
建议

更新:添加rewrite.log和error.log输出(注释不允许格式化)

我在rewrite.log中得到以下信息

strip per-dir prefix: /Users/user/Sites/dir/app.json -> app.json
applying pattern '^([^.?]+).json(.*)$' to uri 'app.json'
rewrite 'app.json' -> 'app.php'
add per-dir prefix: app.php -> /Users/user/Sites/dir/app.php
internal redirect with /Users/user/Sites/dir/app.php [INTERNAL REDIRECT]
apache服务器日志显示

The requested URL /Users/user/Sites/dir/app.php was not found on this server.

如果我没看错你的问题,你想:

http://server/path/app.json?a=foo&b=bar
前往:

http://server/path/foo.php?a=foo&b=bar
因此,当您捕获
(app)时,json
<1
app
<2
是您的第二个括号,它是。。。无(介于
json
之间的部分)。因为问号后面的所有内容都是查询字符串,无法在此处捕获。您的重写规则正在处理请求的文件,而不是查询字符串。所以你没有在任何地方捕捉到
foo
。对于查询字符串,您可以使用重写规则上的
[QSA]
标志,在重写后只需附加
a=foo&b=bar

RewriteEngine On
RewriteRule ^([^.?]+).json(.*)$ $1.php$2 [L]
在这里,您告诉apache重用
$1
(文件名不带.json),因此
app.json
将被重定向到
app.php
,而不是
foo.php

RewriteEngine On
RewriteRule ^([^.?]+).json(.*)$ $1.php [L,QSA]
app.json?a=b&z=r
重定向到
app.php?a=b&z=r

现在,如果您确实需要捕获
foo
作为第一个查询字符串参数,那么规则将变得更加困难。但是您可以这样做(这里不是第一个参数,而是检测参数'a=',并在%4中捕获他的值):


日志中有什么内容吗?这也会匹配/path/json/fish并将其重写为/path.php/fishcomments不允许任何格式,因此请参阅上面的原始帖子以获取rewrite.log输出。我认为它
/Users/user/Sites/dir/app.php
存在,并且apache可以读取,如果直接请求php文件会发生什么情况?它工作正常,并正确返回结果。
RewriteCond %{QUERY_STRING} (.*)(^|&|%26|%20)a(=|%3D)([^&]+)(.*)$
RewriteRule ^([^.?]+).json$ %4.php? [L,QSA]