mod_rewrite 一些没有重写的文件的错误 500 不会给出错误

mod_rewrite Error 500 for some though file without rewrites does not give error

我正在尝试设置从 /api/user{/id} 到 api/user.php{/id} 的重写,但由于某种原因它不起作用。我想这是一个内部重写循环,但我不知道如何修复它。

RewriteCond %{REQUEST_URI} ^\/?api\/user\/?([a-zA-Z0-9_\-\/]+)?
RewriteRule ^\/?api\/user\/?(.*)?$ api/user.php/ [L,QSA]

文件夹结构:

api/
api/user.php

当我更改重写规则使其不是用户而是用户 2 时,它可以正常工作。但是,这不是我需要的,所以如果你能帮我找到一个保留命名的解决方案,那就太好了。 这是与 user2:

一起工作
RewriteCond %{REQUEST_URI} ^\/?api\/user2\/?([a-zA-Z0-9_\-\/]+)?
RewriteRule ^\/?api\/user2\/?(.*)?$ api/user.php/ [L,QSA]

这可能就是您要查找的内容:

RewriteEngine on
RewriteRule ^/?api/user(?:/([a-zA-Z0-9_/-]*))?$ /api/user.php/ [END]

它匹配 /api/user/api/user/ 而没有捕获任何内容。对于每个更长的请求 URL ,其余部分与您指定的字符组匹配。

如果您使用上述规则收到内部服务器错误(http 状态 500),则可能是您运行的 apache http 服务器版本非常旧。在这种情况下,您将在您的 http 服务器错误日志文件中看到对不受支持的 [END] 标志的明确提示。您可以尝试升级或使用旧的 [L] 标志,在这种情况下它可能会工作相同,尽管这在一定程度上取决于您的设置。

此实现同样适用于 http 服务器主机配置或分布式配置文件(“.htaccess”文件)。显然重写模块需要在http服务器内部加载并在http主机中启用。如果您使用分布式配置文件,您需要注意它的解释在主机配置中完全启用并且它位于主机的 DOCUMENT_ROOT 文件夹中。

一般性评论:您应该始终更喜欢将此类规则放在 http 服务器主机配置中,而不是使用分布式配置文件 (".htaccess")。那些分布式配置文件增加了复杂性,通常是意外行为的原因,难以调试并且它们确实减慢了 http 服务器的速度。它们仅在您无法访问真正的 http 服务器主机配置(阅读:非常便宜的服务提供商)或坚持编写自己的规则(这是一个明显的安全噩梦)的应用程序的情况下作为最后的选择提供。