【问题标题】:.htaccess file / hide subdirectory.htaccess 文件/隐藏子目录
【发布时间】:2019-04-01 18:43:54
【问题描述】:

我尝试了在 StackOverflow 上找到的几种解决方案,但它们似乎都不起作用。 首先,在文档根目录上,我有 .htaccess 文件 和 index.php 来检测语言并重定向到 /fr/ 目录或 /en/ 目录。 然后我有 index.html 文件和一个名为“pages”的目录,它们都是我的页面。这样,所有的 url 就像http://example.com/fr/index.html 或http://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

【问题讨论】:

  • index.php 的用途是什么,似乎服务器只看到 index.php 而不是 index.html
  • 您必须手动执行操作,尝试RewriteRule ^/fr/a/?$ fr/a.html [NC,L] 您的重定向链接将是 example.com/fr/a 可能会为您带来魔力
  • 您的“网站结构”是否完整?如果是,那么就没有必要“隐藏 php 扩展”——因为你没有任何!?此外,a.html、b.html 等真的是单字符基本名称(如您的示例中所示)吗?如果是,则可以进一步简化指令。

标签: php html regex .htaccess


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

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

您说“很好”,但是,这似乎与您的站点结构无关,所以它似乎没有任何作用?该指令假定您在文档根目录中有index.html。但是您不想删除index.html 和index.php,不管它们出现在URL 路径中的什么位置吗?例如,类似:

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

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

这还要求index.php 和index.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]
    

这是一个冲突。你有相同的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]

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

但是,如果有一个模式,那么这可以大大改善。

  1. 隐藏页面目录(我不介意是否显示/fr/ 或/en/ 目录)这样URL 将是这样的(最后):http://example.com/fr/a

为了澄清,你必须先链接到example.com/fr/a。

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

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

【讨论】:

  • 是的,我的结构不完整。我忘了提到在/pages/ 目录中有一个php 文件(contact.php),它同时存在于/fr/ 和/en/ 中。对不起。这就是为什么我需要 php 文档的重写规则。 Index.php 只是在这里检测访问者是说法语还是说英语,然后它会重定向到正确的目录。谢谢你的回答,页面的重写规则是完美的,我只是无法显示我的contact.php 页面。不知道为什么...
  • 事实上我知道为什么,它试图到达/pages/contact.html而不是/contact
  • 我只是从重写页面规则中删除了 .html 扩展名,现在一切正常。谢谢!
  • @MrWhite 这个解释很有用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-17
  • 2017-08-03
  • 2015-07-10
  • 2023-03-11
  • 2020-07-05
  • 1970-01-01
相关资源
最近更新 更多