使用 index.php 作为子文件夹的主文件 - htaccess

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

默认情况下,我的托管服务提供商不使用

index.php
文件作为文件夹的主文件,所以如果我去
mydomain.com/dashboard/
例如,它说该页面不存在,但是当我去
 mydomain.com/dashboard/index.php
它有效。我试图用
htaccess
文件解决这个问题并找到了解决方案,但它并不完全有效。这是因为我的
htaccess
中还有其他东西可以从 url 中删除
.php
扩展名。如果我删除这部分,它确实有效,但是我的 url 上再次有
.php
扩展名,这是我不想要的。这是我的
htaccess
:

RewriteEngine On

Options +FollowSymLinks

RewriteCond %{THE_REQUEST} ^.*/index.php
RewriteRule ^(.*)index.php$ https://www.example.com/$1 [R=301,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.php [NC,L]

有人可以帮我解决这个问题吗?

apache .htaccess mod-rewrite
1个回答
0
投票

您需要设置

DirectoryIndex
(mod_dir 的一部分)——这会指示 Apache 在请求目录时要提供哪些文件。 (Apache 的默认值是
index.html
仅在请求的目录中。)

例如:

DirectoryIndex index.php

参考:


RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.php [NC,L]

这无条件地将

.php
扩展名附加到任何未映射到文件的请求。这个“问题”是如果你请求一个directory(假设URL路径不包含一个点)然后它会将请求重写为
/<directory>/.php
这可能会导致404.

如果您使用无扩展名的 URL(并直接请求目录),那么您需要在重写请求之前检查目标文件是否存在。例如:

# Rewrite extensionless URL to ".php" file only if it exists
RewriteCond %{DOCUMENT_ROOT}/$1.php -f
RewriteRule ^([^.]+)$ $1.php [L]

无需反斜杠转义正则表达式字符类中的文字点。

NC
标志在这里是多余的。

您还应该确保禁用了 MultiViews,否则您的规则将被绕过。例如:

Options +FollowSymLinks -MultiViews
© www.soinside.com 2019 - 2024. All rights reserved.