将 url 设为 dir/file/file 时出现 500 内部错误
I am getting 500 internal error when giving url as dir/file/file
当我尝试将 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 ^(.*?)/?$ .php [L]
# To internally forward /dir/foo to /dir/foo.php
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*?)/?$ .php [L]
您收到 rewrite-loop(500 错误),因为您正在检查的文件名,即。 %{REQUEST_FILENAME}.php
不一定与您要重写的文件相同,即。 .php
.
如果你请求/dir/file/file
那么REQUEST_FILENAME
服务器变量是<document-root>/dir/file
(没有path-info),而捕获的反向引用</code>是<code>/dir/file/file
.
改为尝试以下操作:
# To internally forward /dir/foo to /dir/foo.php
RewriteCond %{DOCUMENT_ROOT}/.php -f
RewriteRule ^(.*?)/?$ .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
当我尝试将 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 ^(.*?)/?$ .php [L]
# To internally forward /dir/foo to /dir/foo.php RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME}.php -f RewriteRule ^(.*?)/?$ .php [L]
您收到 rewrite-loop(500 错误),因为您正在检查的文件名,即。 %{REQUEST_FILENAME}.php
不一定与您要重写的文件相同,即。 .php
.
如果你请求/dir/file/file
那么REQUEST_FILENAME
服务器变量是<document-root>/dir/file
(没有path-info),而捕获的反向引用</code>是<code>/dir/file/file
.
改为尝试以下操作:
# To internally forward /dir/foo to /dir/foo.php
RewriteCond %{DOCUMENT_ROOT}/.php -f
RewriteRule ^(.*?)/?$ .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