我尝试了在StackOverflow上找到的几种解决方案,但都没有成功。
首先,在文档根目录下,我有.htaccess文件和index.php,用于检测语言并在/fr/
目录或/en/
目录下重定向。
然后我有index.html文件和一个名为“pages”的目录,它们都是我的页面。这样,所有的url都像http://example.com/fr/index.html或http://example.com/fr/pages/a.html。
我想:
隐藏“index.html”。如果我没弄错的话,这个解决方案是
好的:
RewriteEngine On
RewriteRule ^index\.html$ / [R=301,L]
隐藏html和php扩展。我用过这个,它起作用了
对php很好,但对html不好……不知道为什么。
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+?)/?$ $1.php [NC,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+?)/?$ $1.html [NC,L]
隐藏页面目录(我不介意/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.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.
中隐藏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
文件的混合,没有可辨别的模式,那么您需要执行文件系统检查,看看文件在重写之前是否存在(这是比较昂贵的)。例如: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]
在字符类内使用时,不需要反斜杠转义点(以匹配文字点),因为在字符类内使用时(与regex中的其他地方相反)它没有特殊意义。
但是,如果有一个模式,那么这个可以大大改进。
隐藏页面目录(我不介意是否显示
.php
或/fr/
目录),以便URL将如下所示(最后):/en/
要澄清,您必须首先链接到
http://example.com/fr/a
。然后,要将所有请求重写到
example.com/fr/a
子目录(并在同一动作中附加/pages
扩展),可以执行以下操作:RewriteRule ^(fr|en)/([^/.]+)$ /$1/pages/$2.html [L]