500内部服务器错误对于这些重写规则

时间:2014-06-18 23:10:33

标签: php .htaccess

这是我的.htaccess

Options +FollowSymLinks  

<IfModule mod_rewrite.c>
 RewriteEngine On

这两行是问题

 RewriteCond %{HTTPS} != on
 RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

...

 RewriteRule ^/?$ index.php

 RewriteCond %{SCRIPT_FILENAME} !-d  
 RewriteCond %{SCRIPT_FILENAME} !-f  

 RewriteRule ^.*$ index.php
</IfModule>

有谁知道为什么这是一个内部服务器错误以及如何解决它,我有一个规则阻止用户访问非https版本,另一个规则重写url和重定向。我使用控制器来处理所有网页。

1 个答案:

答案 0 :(得分:1)

试试这个。主要更改是https检测以及使用REQUEST_FILENAME而不是SCRIPT_FILENAME

Options +FollowSymLinks  

<IfModule mod_rewrite.c>
  RewriteEngine on 
  ReWriteCond %{SERVER_PORT} !^443$ 
  RewriteRule ^/?(.*) https://%{HTTP_HOST}/$1 [NC,R,L]

  RewriteRule ^/?$ index.php

  RewriteCond %{REQUEST_FILENAME} !-d  
  RewriteCond %{REQUEST_FILENAME} !-f  

  RewriteRule ^.*$ index.php
</IfModule>

对于类似这样的事情,一个好的调试技术是如果你在Unix / Linux或Mac OS X中那么从命令行使用curl -I。这将返回头信息,包括重定向和放大器。这样。例如,以下是curl -I上Google的http://google.com/输出:

curl -I http://google.com/

HTTP/1.1 301 Moved Permanently
Location: http://www.google.com/
Content-Type: text/html; charset=UTF-8
Date: Wed, 18 Jun 2014 23:20:00 GMT
Expires: Fri, 18 Jul 2014 23:20:00 GMT
Cache-Control: public, max-age=2592000
Server: gws
Content-Length: 219
X-XSS-Protection: 1; mode=block
X-Frame-Options: SAMEORIGIN
Alternate-Protocol: 80:quic

请注意HTTP/1.1 301 Moved PermanentlyLocation: http://www.google.com/行。这告诉您Google的服务器已设置为将google.com个请求重定向到www.google.com。与在浏览器中加载URL相比,在您自己的本地规则上使用它是一种很好的调试方法。处理缓存的内容问题。

编辑:因为在您的评论中您解释了所有内容的完成情况index.php,请尝试使用此默认WordPress .htaccess的稍微修改版本:

<IfModule mod_rewrite.c>
  RewriteEngine On

  ReWriteCond %{SERVER_PORT} !^443$ 
  RewriteRule ^/?(.*) https://%{HTTP_HOST}/$1 [NC,R,L]

  RewriteBase /
  RewriteRule ^index\.php$ - [L]
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteRule . /index.php [L]
</IfModule>