共享主机上的html站点出现500错误,是我的.htaccess语法错误



第一次在这里。我实际上是一个工业&来自墨西哥的系统工程师,试图成为自学成才的Web开发人员/平面设计师如果我的英语有缺陷,我很抱歉;因为我是一个如此愚蠢的人,尤其是如果我的问题已经被别人问过了,或者其他什么的。(不过我确实搜索了问题)

我刚刚完成了(从一个购买的html模板)一家新公司(这是我的客户)的网站的1º阶段(以及所有设计方面):https://www.starhauss.com/

网站运行良好。。。考虑到对我的要求,考虑到这是1º阶段,它有一些小缺陷。。。我想。

无论如何

我需要用.htaccess为我的客户做(并尝试)几件事,尽快

  1. 重定向到自定义404
  2. 声明西班牙语(该网站很快就会在/en/directory上有英文版)
  3. 阻止可感知的服务器信息
  4. 禁用目录列表
  5. 从URL中删除www
  6. 从url中删除html文件扩展名
  7. 阻止隐藏文件出现
  8. 块";危险的";文件不显示
  9. 在URL上强制使用https
  10. 检查&更正url上的简单拼写错误

我研究了Apache指南和;来自不同来源的一切&我提出了自己的.htaccess文件,但我不确定语法是否错误,或者我是否需要联系相应的主机支持人员,以便他们允许执行我的文件,因为当它通过US-ASCII755文件权限CyberDuck上传(现在它没有上传)到根目录编码文本时,访问我的网站会导致500内部服务器错误。我不知道共享托管公司的服务器上默认有哪些模块,但据我所知,它们确实适用于Apache平台

我的.htaccess代码是下一个

# redirect not found
ErrorDocument 404 /404.html
# declare language for multilingual sites, adding a .htaccess file for each language subdirectory
DefaultLanguage es
# prevent server from outputing sensible information
ServerSignature Off
# disable directory listings, only when on
Options -Indexes
# requirement to change urls & such
RewriteEngine On
# use in subdirectories if rewrite rules are not working properly
# RewriteBase /
# mod_rewrite.c wrapper works mainly with WordPress & such
# <IfModule mod_rewrite.c>
# remove www from urls
RewriteCond %{HTTPS} !=on
RewriteCond %{HTTP_HOST} ^www.(.+)$ [NC]
RewriteRule ^ http://%1%{REQUEST_URI} [R=301,L]
# remove html file extension
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^.]+)$ $1.html [NC, L]
# block hidden files
RewriteCond %{SCRIPT_FILENAME} -d [OR]
RewriteCond %{SCRIPT_FILENAME} -f
RewriteRule "(^|/)." - [F]
# </IfModule>
# block risky files
<FilesMatch "(^#.*#|.(bak|config|dist|fla|inc|ini|log|psd|sh|sql|sw[op])|~)$">
Order allow,deny
Deny from all
Satisfy All
</FilesMatch>
# force https
<IfModule mod_headers.c>
Header set Strict-Transport-Security max-age=16070400;
</IfModule>
# check & correct url spelling errors, useful for SEO
<IfModule mod_speling.c>
CheckSeplling On
</IfModule>

伙计们,你们觉得怎么样?它应该起作用吗?代码语法、顺序或其他方面有问题吗?是否缺少服务器端的某些内容以使文件正常工作&如果是,如果我没有访问Httpd.Conf的权限,我怎么知道?我应该联系共享主机支持,让他们允许我的文件吗?

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

RewriteRule标志参数中存在错误的空间。这将导致500内部服务器错误,如果你查看服务器的Error.log,你会看到一个错误报告;RewriteRule:错误的标志分隔符"。

每当您收到500错误(这只是一个通用的服务器响应)时,您需要查看服务器的错误日志以了解该错误的详细信息。

在这种情况下,[NC, L]应该是[NC,L]。虽然NC标志在这里是多余的,所以[L]是足够的。

<IfModule mod_speling.c>
CheckSeplling On
</IfModule>

您拼写错了CheckSpelling。(这也会触发500错误响应。)

  1. 在URL 上强制https

    # remove www from urls
    RewriteCond %{HTTPS} !=on
    RewriteCond %{HTTP_HOST} ^www.(.+)$ [NC]
    RewriteRule ^ http://%1%{REQUEST_URI} [R=301,L]
    

你实际上并不是"强制HTTPS";在任何地方

以上仅删除HTTP上的www。为什么在上述www到非www重定向和重定向到HTTP而不是HTTPS中,您要特别检查请求是否为而不是HTTPS?

您可以将上面的内容更改为以下内容,以删除HTTP和HTTPS上的www(同时规范HTTPS):

# Remove www (redirect to HTTPS)
RewriteCond %{HTTP_HOST} ^www.(.+)$ [NC]
RewriteRule ^ https://%1%{REQUEST_URI} [R=301,L]

并添加一个额外的规则来强制HTTPS(但是,请参阅下面关于HSTS*1的注释):

# Force HTTPS
RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
# force https
<IfModule mod_headers.c>
Header set Strict-Transport-Security max-age=16070400;
</IfModule>

这不是严格意义上的";强制https";。

这个";HSTS标题";指示浏览器在用户通过HTTPS访问网站后始终请求HTTPS。如果用户只通过HTTP访问过网站,则它不会起任何作用(因此需要首先将用户重定向/强制用户使用HTTPS-请参阅上文)。然而,这还不完全-您需要首先在同一主机上重定向(*1即反转上面的两个重定向),并在301重定向上设置头,该重定向通过HTTPS删除www(此指令不这样做)。理想情况下,您应该避免通过纯HTTP发送标头(尽管这并不重要,因为浏览器会忽略它)。

我一开始会避免设置HSTS,直到你的网站通过HTTPS正常工作。您应该将HSTS视为单程旅行,在这一点上回溯是有问题的(对于通过HTTPS访问的任何的人,max-age=16070400将持续6个多月)。

请参阅CodeReview堆栈中有关HSTS实现的以下相关问题:https://codereview.stackexchange.com/questions/250805/hsts-recommendations-in-htaccess

Order allow,deny
Deny from all
Satisfy All

这些是Apache 2.2指令,以前在Apache 2.4上不推荐使用。我假设您使用的是Apache2.4(Apache2.2在大约2年前是EOL)。您应该使用Apache 2.4指令:

Require all denied

最新更新