mod_rewrite:当使用 REQUEST_FILENAME 时 URI 包含不带扩展名的现有文件,后跟 /whatever 时,会触发错误 500

问题描述 投票:0回答:1

我想做的事

如果 URL 中请求的资源没有扩展名并且文件名与资源匹配,则使用 mod_rewrite 来服务该文件。否则,触发错误404。

例如请求是 /foo 并且我有 foo.html 那么我应该为 foo.html 提供服务

测试用例

我有一个名为 foo.html 的文件

  • 如果用户请求 URL website.com/foo 它工作正常 -> 显示 foo.html 的内容
  • 如果用户请求 URL website.com/foo.html 它工作正常 -> 显示 foo.html 的内容
  • 如果用户请求 URL website.com/foo.html/bar 则工作正常 -> 404
  • 如果用户请求 URL website.com/foo/bar,它会 NOT 工作 => ERROR 500 而不是 404

我尝试了什么

RewriteEngine on
RewriteCond %{REQUEST_FILENAME}\.html -f
RewriteRule ^(.*)$ $1.html [NC,L]

到目前为止我的理解

浏览 SO 和 Apache 文档后我最好的选择是这一行:

根据 AcceptPathInfo 的值,服务器可能仅使用 REQUEST_URI 的一些前导组件将请求映射到文件。

来源

我假设这是错误原因是否正确? REQUEST_FILENAME = foo 而不是 /foo/bar ? 没有日志很难判断。

如果我是对的,替代方案是什么?我可以检查 REQUEST_FILENAME 是否以 REQUEST_URI 结尾吗?这会告诉我这个行为被触发了。

附加信息

  • 我正在租用一些基本的网络托管服务,我认为我无法访问httpd.conf。我在文件系统里找了没找到
  • 我没有找到 mod_rewrite 的任何日志,并且我不确定它是否已打开(需要在 httpd.conf 中添加跟踪级别)
  • 我真的不知道网络服务器和版本是什么。我认为它是 Apache,因为它使用 .htaccess 文件
  • 我发邮件给公司询问更多详情。收到回复后会更新

日志

Internal Server Error
The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator at [email] to inform them of the time this error occurred, and the actions you performed just before this error.

More information about this error may be available in the server error log.

Additionally, a 500 Internal Server Error error was encountered while trying to use an ErrorDocument to handle the request.
apache .htaccess mod-rewrite url-rewriting friendly-url
1个回答
0
投票

我确认。问题是由于 Apache 配置,REQUEST_FILENAME 不可靠。 因为它是共享主机,所以我无法修改该选项。

所以我不得不诉诸丑陋的硬编码。 我基本上通过使用 REQUEST_URI 来伪造我想要的 REQUEST_FILENAME,这样我可以测试我真正感兴趣的文件。

# Hide html
RewriteCond /path_to/public_html%{REQUEST_URI}\.html -f
RewriteRule ^(.*)$ $1.html [NC,L,E=LOOP:1]
© www.soinside.com 2019 - 2024. All rights reserved.