无论我做什么,.htaccess都不会做这个工作

时间:2016-06-22 07:17:55

标签: html apache .htaccess

使用.htacess文件对我来说一直是一个非常令人沮丧的经历。有人请帮忙。

这就是我想要实现的目标:

  • 我正在运行Ubuntu 14.04。
  • 将我的整个网站(example.com)重定向到maintenance.html页。
  • 阻止除一个IP之外的所有其他人,例如,我只需要允许123.456.789.0

以下是我的文件:

  • index.html的位置为/var/www/html
  • maintenance.html的位置为/var/www/html
  • 我的.htaccess文件的位置为/var/www/html

我的.htaccess文件的内容:

#Rewrite to www
Options +FollowSymLinks
RewriteEngine on
RewriteCond %{HTTP_HOST} ^example.com[nc]
RewriteRule ^(.*)$ http://www.example.com/$1 [r=301,nc]

#301 Redirect Old File
Redirect 301 /index.html /maintenance.html

#Block users by IP
order allow,deny
deny from all 
allow from 123.456.789.0

请帮助我理解:

  • 上述每个文件的位置是否正确?在什么情况下, 页面最终在500 internal server error
  • 我应该做些什么改变
    • /etc/apache2/apache.conf
    • /etc/apache2/sites-enabled/000-default.conf
    • /etc/apache2/sites-available/000-default.conf
  • 是否需要运行a2enmod rewrite
  • 我应该在上述任何<IfModule mod_rewrite.c>文件中添加</IfModule>config作为页眉和页脚吗?

很抱歉有太多问题,但我真的很想知道这一切。 提前谢谢。

2 个答案:

答案 0 :(得分:1)

  

上述每个文件的位置是否正确?在什么情况下,   页面最终在500 internal server error

A&#34; 500内部服务器错误&#34;消息表示存在错误,您需要检查服务器日志以获取确切的详细信息。 Apache不会显示每个人都能看到的错误消息。

  

我应该做出哪些改变

这取决于问题所在。如果问题是&#34; 500内部服务器错误&#34;这意味着我们仍然不知道问题所在。

  

是否需要运行a2enmod重写?

该命令启用mod_rewrite。如果未启用,则需要启用它。如果已经启用,则不需要启用它。

值得注意的是,此命令不是官方Apache发行版的一部分。一些Linux发行版(即Debian和衍生产品)会更改第三方软件包以匹配其配置首选项,如本例所示。

  

我应该添加<IfModule mod_rewrite.c></IfModule>作为标头   和任何上述配置文件中的页脚?

正如documentation所解释的,当未安装给定模块时,此块可用于忽略指令。这对于要分发的配置模板和可选功能非常有用。在您的情况下,如果mod_rewrite不可用,它会默默地忽略您的代码 - 您不希望这样。

最后但并非最不重要:

order allow,deny
deny from all 
allow from 123.456.789.0

...属于旧的(并且很难理解)Apache / 2.2语法。如果您使用的是Apache / 2.4 *,则可能需要尝试Require

(*)有些发行版讨厌捆绑最近的软件,但2.4已存在好几年

答案 1 :(得分:1)

感谢@OlafDietsche和@ÁlvaroGonzález的快速帮助。我在这里保留他们的建议,所以像我这样的人会发现它很有用。

问题在于我的目标,而不是语法。通过他们的评论和回答,我发现我的两个目标是相互矛盾的。

我配置.htaccess同时执行页面重定向和IP块。但是,如果我阻止(几乎)所有人访问该网站,页面重定向毫无意义。

.htaccess中所需的配置是:

  #Rewrite to www
  Options +FollowSymLinks
  RewriteEngine on
  RewriteCond %{HTTP_HOST} ^example.com[nc]
  RewriteRule ^(.*)$ http://www.example.com/$1 [r=301,nc]

  #301 Redirect Old File
  Redirect 301 /index.html /maintenance.html