现在使用htaccess删除了.html扩展名index.html给出403错误

时间:2017-07-26 18:58:35

标签: .htaccess

输入以下代码后,我的主页会出现403错误。该网站的其余部分完美运作。所有.html实例都被删除了。

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f

RewriteRule ^([^\.]+)$ $1.html [NC,L]

有什么建议吗? 谢谢!

1 个答案:

答案 0 :(得分:0)

  

example.com导致403错误。如果我写example.com/index它可以正常工作。

其他必须更改的内容才会导致403错误。当您请求example.com/时,您发布的代码实际上无法执行任何操作 - 就像该代码根本不存在一样。 (更新:但是,这假设您的.htaccess文件位于文档中 - 看起来情况并非如此 - 请参阅下文。)

但是,在这种情况下会触发403的是格式化目录列表"被禁用,目录索引文档无法找到(或已被禁用)。

因此,请尝试在.htaccess文件的顶部设置相应的目录索引:

DirectoryIndex index.html

DirectoryIndex在请求您的"主页"时提供相应的文件,而不是.htaccess中的指令。

<强>更新

  

[.htaccess]位于我的根目录中。将它放在public_html文件夹中会更好吗?

是的,您发布的代码应该放在/public_html目录中(即您的文档根目录)。如果这些指令位于文档根目录的.htaccess文件上方,那么RewriteRule 模式将匹配URL路径public_html/和将URL重写为public_html/.html,这可能是403错误的来源(&#34; dot&#34;文件通常是隐藏/受保护的OS文件,您可能在服务器配置阻止访问时也有一个指令。但是,此行为也可能取决于服务器配置/ OS中的其他因素。但是,使用文档根目录中的代码,然后example.com/(您的主页)的请求不会被这些指令处理(这很好) - mod_dir应该提供index.html文件在这种情况下。

但是,您不想处理&#34;目录&#34;无论如何(public_html显然是&#34;目录&#34;而不是文件)。这就是上面发生的事情。例如。不应将.html附加到public_html/以开始(或example.com/path/to/directory/或任何其他目录)。这可以通过向规则块添加附加条件来避免目录(以及文件)。例如:

RewriteEngine On

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

只需添加额外的RewriteCond指令就足够了,仍然允许您将.htaccess文件保留在文档根目录之上。 (但是,您可能仍需要移动.htaccess文件,如上所述。)

此外,此处不需要NC标记,并且在字符类中使用时,不需要转义字符点。

您还可以扩展此代码,以便在重写之前首先检查文件是否存在(带有.html扩展名),尽管在您的情况下这可能是不必要的。例如:

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

这需要额外的&#34;文件检查&#34;这可能是不必要的开销。