Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/247.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php mod_rewrite.htaccess在URl不存在时导致500服务器错误_Php_.htaccess_Mod Rewrite_Webserver - Fatal编程技术网

Php mod_rewrite.htaccess在URl不存在时导致500服务器错误

Php mod_rewrite.htaccess在URl不存在时导致500服务器错误,php,.htaccess,mod-rewrite,webserver,Php,.htaccess,Mod Rewrite,Webserver,我刚刚开始使用mod_rewrite,这是我用于一个具有多种语言支持的基本结构化网站的方法: RewriteEngine on ErrorDocument 404 /error404.php RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^([a-zA-Z]{2})/([^/]+)$ $2.php?lang=$1 [L] RewriteCond %{REQUEST_FIL

我刚刚开始使用mod_rewrite,这是我用于一个具有多种语言支持的基本结构化网站的方法:

RewriteEngine on
ErrorDocument 404 /error404.php

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([a-zA-Z]{2})/([^/]+)$ $2.php?lang=$1 [L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([a-zA-Z]{2})/$ index.php?lang=$1 [L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([a-zA-Z]{2})$ index.php?lang=$1 [L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)$ $1.php [L]
我的想法是在URl的开头指示语言,并且需要两个字符(a-z或a-z)。在此之后,将出现一个字符串,该字符串引用一个php文件,该文件的文件名与字符串相同,只是附加了.php。该语言将作为GET变量添加(
?lang=en

因此,URl可以如下所示:
/en/index
,然后应该重定向到
index.php?lang=en

如果URl不是以语言开头,而是直接以字符串开头,则不会将GET变量附加到字符串。例如,
/index
应参考
index.php
。如果没有字符串,则应使用索引作为默认值

到目前为止,一切顺利。很好。只要我输入一个字符串(无论我是否使用2个字符作为语言),该站点总是显示500个内部服务器错误,而不是转到
error404.php
。另外,如果我在.htaccess中删除这一行(404),它仍然是相同的错误

因此,我假设.htaccess中的其他行出现了导致此错误的错误,有人知道这可能是什么吗

非常感谢您的帮助

Helmut,试试这个(最后一条规则是500个内部错误的原因,这还包括@DaveRandom合并规则2和3的建议):

Helmut,试试这个(最后一条规则是500个内部错误的原因,这还包括@DaveRandom合并规则2和3的建议):


你的规则是循环的。乍一看,它就像你的最后一个:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)$ $1.php [L]
假设我有这个URL,
http://your.domain.com/blah
,并且文件
blah.php
不存在。这就是正在发生的事情

  • URI=
    等等
    -f是真的,它不是一个文件
  • URI=
    等等
    -d是真的,它不是目录
  • URI=
    blah
    ,内部重写为
    blah.php
  • 废话
    !=
    blah.php
    ,重写规则循环
  • URI=
    blah.php
    -f是真的,它不是一个文件
  • URI=
    blah.php
    -d是真的,它不是目录
  • URI=
    blah.php
    ,内部重写为
    blah.php.php
  • blah.php
    !=
    blah.php.php
    ,重写规则循环
  • 这将一直持续,直到重写引擎已经受够并返回500服务器错误

    您可以在此处执行以下两项操作之一:

  • 添加一个指令,使无论发生什么情况,都停止所有循环,这是一种很容易绕过此类内容的方法。但它将打破需要循环的规则。我在你的规则中没有看到类似的东西,所以这样做是安全的(至少现在是这样)。只需将此添加到规则的顶部:

    RewriteCond %{ENV:REDIRECT_STATUS} 200
    RewriteRule ^ - [L]
    
  • 进行先发制人的检查,查看php文件是否确实存在:

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

  • 你的规则是循环的。乍一看,它就像你的最后一个:

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^([^/]+)$ $1.php [L]
    
    假设我有这个URL,
    http://your.domain.com/blah
    ,并且文件
    blah.php
    不存在。这就是正在发生的事情

  • URI=
    等等
    -f是真的,它不是一个文件
  • URI=
    等等
    -d是真的,它不是目录
  • URI=
    blah
    ,内部重写为
    blah.php
  • 废话
    !=
    blah.php
    ,重写规则循环
  • URI=
    blah.php
    -f是真的,它不是一个文件
  • URI=
    blah.php
    -d是真的,它不是目录
  • URI=
    blah.php
    ,内部重写为
    blah.php.php
  • blah.php
    !=
    blah.php.php
    ,重写规则循环
  • 这将一直持续,直到重写引擎已经受够并返回500服务器错误

    您可以在此处执行以下两项操作之一:

  • 添加一个指令,使无论发生什么情况,都停止所有循环,这是一种很容易绕过此类内容的方法。但它将打破需要循环的规则。我在你的规则中没有看到类似的东西,所以这样做是安全的(至少现在是这样)。只需将此添加到规则的顶部:

    RewriteCond %{ENV:REDIRECT_STATUS} 200
    RewriteRule ^ - [L]
    
  • 进行先发制人的检查,查看php文件是否确实存在:

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

  • 键入
    RewriteLog/path/to/your/rewrite.log
    并使用
    RewriteLogLevel 9
    设置调试级别。请查看error.log(
    ErrorLog/path/error.log
    )了解
    500
    的原因。可能是因为您进入了无限循环。尝试添加文件不是.php文件的条件。第二个和第三个
    重写规则可以合并为一个:
    RewriteRule^([a-zA-Z]{2})/?$index.php?lang=$1[L]
    。这可能无法解决问题,只是一个一般性的评论。@AshwiniDhekane:哦,是的。。这可能就是原因!谢谢。。。你会如何添加这样的条件???@DaveRandom:哦,太酷了!谢谢你的评论!!:)键入
    RewriteLog/path/to/your/rewrite.log
    并使用
    RewriteLogLevel 9
    设置调试级别。请查看error.log(
    ErrorLog/path/error.log
    )了解
    500
    的原因。可能是因为您进入了无限循环。尝试添加文件不是.php文件的条件。第二个和第三个
    重写规则可以合并为一个:
    RewriteRule^([a-zA-Z]{2})/?$index.php?lang=$1[L]
    。这可能无法解决问题,只是一个一般性的评论。@AshwiniDhekane:哦,是的。。这可能就是原因!谢谢。。。你会如何添加这样的条件???@DaveRandom:哦,太酷了!谢谢你的评论!!:)真是天才!非常感谢你,林琼恩!谢谢你花时间详细解释!你现在真的教会了我很多!真是天才!非常感谢你,林琼恩!谢谢你花时间详细解释!你现在真的教会了我很多!