默认情况下,我的托管服务提供商不使用
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]
有人可以帮我解决这个问题吗?
您需要设置
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