.htaccess如何删除文件扩展名和索引文件



我试图通过。htaccess实现一些事情,但不断遇到问题。在你告诉我我需要更好地研究之前,已经有一个解决方案在这个或不同的论坛上,请知道我已经做到了。在来这里之前,我总是自己想办法解决问题,但这件事真的难倒了我。我所做的一切都只是部分奏效。如果有任何帮助或教育,我将非常感激。

我的网站有以下简单的结构:

(root)
|   index.html
|   .htaccess
|
|___portal-folder
|     index.php
|     home.php
|
|_____admin-folder
|     index.php

我希望实现以下目标:

  1. 当用户导航到任何基本目录时,例如site.comsite.com/portal-folder/,他们不会在浏览器中看到索引文件名index.htmlindex.php

  2. 同样成立,如果用户导航到完整的URLsite.com/index.htmlsite.com/portal-folder/index.php,我希望用户看到site.comsite.com/portal-folder/分别在他们的浏览器。

  3. 删除浏览器中所有文件的扩展名。例如,导航到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]

最新更新