将 index.html 设为默认值,但如果输入则允许访问 index.php
Posted
技术标签:
【中文标题】将 index.html 设为默认值,但如果输入则允许访问 index.php【英文标题】:Make index.html default, but allow index.php to be visited if typed in 【发布时间】:2012-04-17 15:34:07 【问题描述】:我的 .htaccess 文件中有以下行:
DirectoryIndex index.html index.php
每次我访问 index.php 时,我都会访问 index.html。是否可以同时允许两者,但将 index.html 保留为访问 www.domain.com 的用户的默认值?
【问题讨论】:
index.html
和 index.php
是否都存在,还是只有一个?
它们都存在。你是说我的 .htaccess 文件应该允许我访问这两个文件吗?
你不应该在DirectoryIndex
中只有index.html
吗?那么它将是example.com
的默认值。另一个文件应该在example.com/index.php
可用。
即使 index.php 存在,它实际上会将您重定向到 index.html?然后有一些其他配置干扰。也许重写规则出错了?
我建议您查看您的 index.php
并确保它没有使用某些 header
函数将您重定向到 /
。
【参考方案1】:
默认情况下,DirectoryIndex 设置为:
DirectoryIndex index.html index.htm default.htm index.php index.php3 index.phtml index.php5 index.shtml mwindex.phtml
Apache 将按顺序查找上述每个文件,并在访问者仅请求目录时提供它找到的第一个文件。如果网络服务器在当前目录中没有找到与 DirectoryIndex 指令中的名称匹配的文件,则将向浏览器显示目录列表,显示当前目录中的所有文件。
顺序应该是DirectoryIndex index.html index.php
// 默认是index.html
参考:Here。
【讨论】:
谢谢伙计,今晚我将删除 .htaccess 文件,看看这是否能解决我的问题。我觉得这似乎有点奇怪,因为在此之前我的任何网站都没有发生过这种情况。【参考方案2】:如果您使用的是 WordPress,现在有一个过滤器挂钩可以解决此问题:
remove_filter('template_redirect', 'redirect_canonical');
(把这个放在你主题的functions.php
)
这告诉 WordPress 不要将index.php
重定向回根页面,而是原地不动。这样,index.html
可以指定为.htaccess
中的默认页面,并且可以与index.php
一起使用。
【讨论】:
那是救命稻草!!【参考方案3】:我同意@TheAlpha 接受的答案,Apache 从左到右读取 DirectoryIndex 目标文件,如果第一个文件存在,apche 提供它,如果不存在,则下一个文件作为目录的索引。因此,如果您有以下指令:
DirectoryIndex file1.html file2.html
Apache 会将 /file.html 作为索引,如果你想设置 /file2.html 作为索引,你需要改变文件的顺序
DirectoryIndex file2.html file1.html
您也可以使用 RewriteRule 设置索引文件
RewriteEngine on
RewriteRule ^$ /index.html [L]
上面的 RewriteRule 会将您的主页重写为 /index.html 重写发生在内部,因此 http://example.com/ 将向您显示 index.html 的内容。
【讨论】:
【参考方案4】:DirectoryIndex index.html index.htm default.htm index.php index.php3 index.phtml index.php5 index.shtml mwindex.phtml
没有办法吗? 你可能只需要像这样添加!
<IfModule dir_module>
DirectoryIndex index.php index.html index.htm
</IfModule>
【讨论】:
【参考方案5】:嗨,
嗯,上面提到的方法我都试过了!它工作是的,但不完全是我想要的方式。我想通过我们的进一步操作将默认页面扩展名重定向到主域。
我该怎么做...
# Accesible Index Page
<IfModule dir_module>
DirectoryIndex index.php index.html
RewriteCond %THE_REQUEST ^[A-Z]3,9\ /index\.(html|htm|php|php3|php5|shtml|phtml) [NC]
RewriteRule ^index\.html|htm|php|php3|php5|shtml|phtml$ / [R=301,L]
</IfModule>
上面的代码只是简单地捕获任何索引。*并将其重定向到主域。
谢谢
【讨论】:
【参考方案6】:RewriteEngine on
RewriteRule ^(.*)\.html$ $1.php%QUERY_STRING [L]
将这两行放在 .htaccess 文件的顶部。它将在您的 .php 页面的 URL 中显示 .html。
RewriteEngine on
RewriteRule ^(.*)\.php$ $1.html%QUERY_STRING [L]
使用它在您的 .html 页面的 URL 中显示 .php。
【讨论】:
这看起来很漂亮,但不是我害怕之后的样子。以上是关于将 index.html 设为默认值,但如果输入则允许访问 index.php的主要内容,如果未能解决你的问题,请参考以下文章
如果对象存在于全局中,则R从函数中从全局环境中获取对象,但如果不存在则使用不同的默认值