我试图通过。htaccess实现一些事情,但不断遇到问题。在你告诉我我需要更好地研究之前,已经有一个解决方案在这个或不同的论坛上,请知道我已经做到了。在来这里之前,我总是自己想办法解决问题,但这件事真的难倒了我。我所做的一切都只是部分奏效。如果有任何帮助或教育,我将非常感激。
我的网站有以下简单的结构:
(root)
| index.html
| .htaccess
|
|___portal-folder
| index.php
| home.php
|
|_____admin-folder
| index.php
我希望实现以下目标:
当用户导航到任何基本目录时,例如
site.com
或site.com/portal-folder/
,他们不会在浏览器中看到索引文件名index.html
或index.php
。同样成立,如果用户导航到完整的URL
site.com/index.html
或site.com/portal-folder/index.php
,我希望用户看到site.com
或site.com/portal-folder/
分别在他们的浏览器。删除浏览器中所有文件的扩展名。例如,导航到
site.com/portal-folder/home.php
在浏览器中显示为site.com/portal-folder/home
下面的代码我正在使用的工作,但我得到奇怪的行为。例如:
导航到
site.com/portal-folder/index
不会删除索引文件名,在浏览器中显示为site.com/portal-folder/index
而不是site.com/portal-folder/
导航到
site.com/portal-folder/
不会删除索引文件名,在浏览器中显示为site.com/portal-folder/index.php
。导航到
site.com/portal-folder/index.php
将用户带回到根site.com
导航到
site.com/portal-folder/home
工作正常,但导航到site.com/portal-folder/home.php
不会剥离。php扩展名。导航到
site.com
工作正常,但导航到site.com/index.html
不能删除索引文件名。RewriteEngine On DirectoryIndex index.html index.php # remove trailing slash RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{THE_REQUEST} s(.+?)/+[?s] RewriteRule ^(.+?)/$ /$1 [R=301,L] # To internally forward /dir/file to /dir/file.php RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{DOCUMENT_ROOT}/$1.php -f RewriteRule ^(.+?)/?$ /$1.php [L]
服务器信息:Apache Version 2.4.46
这样做:
DirectoryIndex index.html index.php
RewriteEngine On
# To externally redirect /dir/file.php to /dir/file and optionally remove index
RewriteCond %{THE_REQUEST} s/+(.*?/)?(?:index|(S+?))(?:.php|.html)?[/s?] [NC]
RewriteRule ^ /%1%2 [R=301,L,NE]
# remove trailing slash
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} ^(.+)/+$
RewriteRule ^ %1 [R=301,NE,L]
# To internally forward /dir/file to /dir/file.php
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{DOCUMENT_ROOT}/$1.php -f
RewriteRule ^(.+?)/?$ $1.php [L]