【问题标题】:Remove .php and .html extensions AND have directories with same name?删除 .php 和 .html 扩展名并具有相同名称的目录?
【发布时间】:2018-08-18 20:31:45
【问题描述】:

我想在浏览器中删除我网站页面的 .php 和 .html 扩展名。我在网上找到这段代码添加到 .htaccess 文件中:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ $1.php`

但是,如果有一个名为“home.php”的 php 文件,同时有一个名为“home”的目录,这将不再起作用。我想我可能需要添加类似

的内容
Options All -Indexes -MultiViews

但我喜欢这样它也不起作用。 那么我该如何实现呢?

【问题讨论】:

  • 所以如果你调用yourdomain.com/home 应该请求什么 - home.php 脚本或home 目录?你到底想达到什么目的?如果您有home.php 作为目录名称或home 作为没有扩展名的脚本名称怎么办?您必须考虑所有情况。
  • 所以调用domain.com/home 应该显示home.php。然后我想要一个名为 home 的文件夹,其中包含其他 php 文件,例如about.php,这样我就可以通过domain.com/home/about 呼叫about.php。我可以使用.htaccess 文件来实现这一点吗?
  • 删除!-d 规则。
  • 这看起来是一个很好的开始,有很多问题......
  • 为什么不把home.php重命名为home/index.php,然后就可以了。

标签: php html .htaccess


【解决方案1】:

您可以在.htaccess 中尝试使用这个简单的代码

RewriteEngine On
RewriteRule ^([^\.]+?)/?$ $1.php [NC,L]

更新: 正如@Niet 提到的,我错过了条件,所以在规则之前添加这一行。

RewriteCond %{REQUEST_FILENAME}\.php -f

【讨论】:

  • 这实际上比问题中的代码更糟糕,因为它甚至不会在尝试重写之前检查文件是否存在。
  • 将 RewriteCond 添加为 %{REQUEST_FILENAME}\.php -f 即可。
【解决方案2】:

当请求没有/ 与目录同名以及删除php & html 并确定首先检查哪个文件时,您可以优先考虑文件:

DirectorySlash Off
RewriteEngine on 
RewriteCond %{THE_REQUEST} \s/+(.*?/)?(?:index)?(.*?)\.(php|html)[\s?/] [NC]
RewriteRule ^ /%1%2 [R=302,L,NE]
RewriteCond %{REQUEST_FILENAME}   !-f 
RewriteCond %{REQUEST_FILENAME}\.php -f 
RewriteRule ^(.*) /$1.php [L]
RewriteCond %{REQUEST_FILENAME}   !-f 
RewriteCond %{REQUEST_FILENAME}\.html -f
RewriteRule ^(.*) /$1.html [L]
RewriteCond %{REQUEST_FILENAME}   !-f 
RewriteCond %{REQUEST_URI} !\/$
RewriteRule ^(.*) %{REQUEST_URI}/ [L,R=302]

所以,通过上面的代码,扩展将被删除,然后首先检查是否有 php 文件与此匹配,然后是 html,最后是否有目录。

所以,/home 的请求只会首先检查一个名为 home 的 php 是否存在,然后是 home 目录,但请求 /home/about 将直接转到主目录中的 about。

清除浏览器缓存再测试,如果没问题,将302改为301以获得永久重定向

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-15
    • 2022-11-25
    • 1970-01-01
    • 1970-01-01
    • 2019-11-24
    • 2014-03-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多