php - 将 url 作为目录/文件/文件时,我收到 500 个内部错误

标签 php apache .htaccess mod-rewrite web-development-server

当我尝试将 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]

最佳答案

# 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

关于php - 将 url 作为目录/文件/文件时,我收到 500 个内部错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64629677/

相关文章:

apache - 从 SSLv3 迁移到 TLSv1

apache - 重定向 410 url 模式

php - 使用 sha512 的安全 php 注册失败

php - wp_register_style() 和 wp_enqueue_style 的区别

java - Apache Solr 查询计算价格中位数

php - MySQL 数据库中特定于用户的计时器操作

php - 如何阻止对目录中图像的直接访问但允许 PHP 显示它们?

facebook - 单页网站、搜索引擎优化和社交媒体共享按钮

php - 按下开始按钮时自动刷新页面,直到按下停止按钮为止。如何保持按下开始按钮的时间

php - 字符串到正则表达式的转换