.htaccess文件/隐藏子目录

时间:2018-10-28 19:21:26

标签: php html regex .htaccess

我尝试了在StackOverflow上找到的几种解决方案,但是似乎都没有用。 首先,在文档根目录上,有 .htaccess文件 index.php ,它们可以检测语言并在/fr/目录或/en/目录上重定向。 然后,我有了 index.html 文件和一个名为“ pages”的目录,其中所有目录都是我的页面。这样,所有网址都类似于http://example.com/fr/index.htmlhttp://example.com/fr/pages/a.html

我想:

  1. 隐藏“ index.html ”。如果我没记错的话,这个解决方案是 很好:

    RewriteEngine On
    RewriteRule ^index\.html$ / [R=301,L]
    
  2. 隐藏 html php 扩展名。我用了这个并且有效 适用于php,但不适用于html ...不知道为什么。

    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteRule ^([^\.]+?)/?$ $1.php [NC,L] 
    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteRule ^([^\.]+?)/?$ $1.html [NC,L] 
    
  3. 隐藏页面目录(我不介意/ fr /或/ en /目录 显示),这样URL就会像这样(最后):http://example.com/fr/a

这是我的结构

├── fr
|   └── index.html
|   └── pages
|       └──a.html
|       └──b.html etc
├── en
|   └── index.html
|   └── pages
|       └──a.html
|       └──b.html etc
├── .htaccess
└── index.php

1 个答案:

答案 0 :(得分:0)

  
      
  1. 隐藏“ index.html”。如果我没记错的话,这个解决方案就可以了:

    RewriteEngine On
    RewriteRule ^index\.html$ / [R=301,L]
    
  2.   

您说“很好”,但是,这似乎与您的网站结构不相关,因此它似乎无能为力吗?该指令假设您在文档根目录中有index.html。但是,您是否要删除index.htmlindex.php而不管它们在URL路径中的位置如何?例如,类似:

RewriteCond %{THE_REQUEST} /index\.(html|php)
RewriteRule (.*)index\.(html|php)$ /$1 [R=301,L]

条件是防止某些服务器配置上的重定向循环。

这还要求index.phpindex.html中都包含DirectoryIndex.

  
      
  1. 隐藏html和php扩展名。我用了它,它在php上很好用,但是在html上却不行。。。不知道为什么。

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

这是冲突。您具有相同的RewriteRule 模式-那么哪个应该“获胜”?第一个指令将永远“赢”,第二个指令将永远不会发生。

但是...您的“网站结构”是否不完整?您的网站结构在文档根目录中显示了一个index.php(无论如何都重定向到/)-子目录中没有.php文件,那么为什么需要检查?

如果您在整个站点结构中确实混合了.html.php文件,并且没有可识别的模式,那么您需要执行文件系统检查以检查文件是否存在,然后再重写(这是相对昂贵的)。例如:

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

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

在字符类中使用时,不需要反斜杠转义点(以匹配文字点),因为在字符类中使用时,它不带有特殊含义(与正则表达式中的其他地方相反)。 / p>

但是,如果有 pattern ,则可以大大改善。

  
      
  1. 隐藏页面目录(我不介意显示/fr//en/目录),以便URL像这样(最后):http://example.com/fr/a
  2.   

为澄清起见,您必须先链接到example.com/fr/a

然后将所有请求重写到/pages子目录(并以同一动作附加.html扩展名),您可以执行以下操作:

RewriteRule ^(fr|en)/([^/.]+)$ /$1/pages/$2.html [L]