将 url 提供为 dir/file/file 时出现 500 内部错误

Posted

技术标签:

【中文标题】将 url 提供为 dir/file/file 时出现 500 内部错误【英文标题】:I am getting 500 internal error when giving url as dir/file/file 【发布时间】:2021-02-14 04:09:21 【问题描述】:

当我尝试将 url 提供为 https://example.com/dir/file/file 时,请求进入循环并出现 500 错误,而它应该提供文件不存在。我正在使用 LAMP 堆栈。我将 .php 隐藏在我的 .htaccess 中

## hide .php extension
# To externally redirect /dir/foo.php to /dir/foo
RewriteCond %THE_REQUEST ^[A-Z]3,\s([^.]+)\.php [NC]
RewriteRule ^ %1 [R=302,L]

# To internally forward /dir/foo to /dir/foo.php
RewriteCond %REQUEST_FILENAME !-d
RewriteCond %REQUEST_FILENAME.php -f
RewriteRule ^(.*?)/?$ $1.php [L]

【问题讨论】:

【参考方案1】:
# To internally forward /dir/foo to /dir/foo.php
RewriteCond %REQUEST_FILENAME !-d
RewriteCond %REQUEST_FILENAME.php -f
RewriteRule ^(.*?)/?$ $1.php [L]

您正在收到一个重写循环(500 错误),因为您正在检查的文件名,即。 %REQUEST_FILENAME.php 不一定与您要重写的文件相同,即。 $1.php.

如果您请求/dir/file/file,则REQUEST_FILENAME 服务器变量为<document-root>/dir/file(无路径信息),而捕获的反向引用$1/dir/file/file

请尝试以下方法:

# To internally forward /dir/foo to /dir/foo.php
RewriteCond %DOCUMENT_ROOT/$1.php -f
RewriteRule ^(.*?)/?$ $1.php [L]

/dir/file/file 的请求现在将失败并返回 404,因为它正在检查 /dir/file/file.php 是否存在。

在检查请求是否映射到文件之前,您实际上不需要检查它是否映射到目录(工作量的两倍),除非您还有同名的目录并且您需要该目录优先考虑(不太可能)。

另请参阅my answer 以了解以下更详细的 ServerFault 问题: https://serverfault.com/questions/989333/using-apache-rewrite-rules-in-htaccess-to-remove-html-causing-a-500-error

【讨论】:

++ 我也注意到 REQUEST_FILENAME 行为不端

以上是关于将 url 提供为 dir/file/file 时出现 500 内部错误的主要内容,如果未能解决你的问题,请参考以下文章

openjudge字符串+模拟1777:文件结构“图”

文件系统用户空间 - 覆盖软链接

从列表 os 文件路径 (Python) 构造树 - 取决于性能

将单体应用拆分为微服务时如何定义 API 网关 URL

在多租户环境中,如何在运行时在不同的 url(子域)上为不同的服务提供者提供不同的元数据?

Python3'ascii'编解码器无法编码字符