Php mod_rewrite.htaccess在URl不存在时导致500服务器错误
我刚刚开始使用mod_rewrite,这是我用于一个具有多种语言支持的基本结构化网站的方法: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
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
不存在。这就是正在发生的事情
等等
-f是真的,它不是一个文件等等
-d是真的,它不是目录blah
,内部重写为blah.php
废话
!=blah.php
,重写规则循环blah.php
-f是真的,它不是一个文件blah.php
-d是真的,它不是目录blah.php
,内部重写为blah.php.php
blah.php
!=blah.php.php
,重写规则循环RewriteCond %{ENV:REDIRECT_STATUS} 200
RewriteRule ^ - [L]
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
不存在。这就是正在发生的事情
等等
-f是真的,它不是一个文件等等
-d是真的,它不是目录blah
,内部重写为blah.php
废话
!=blah.php
,重写规则循环blah.php
-f是真的,它不是一个文件blah.php
-d是真的,它不是目录blah.php
,内部重写为blah.php.php
blah.php
!=blah.php.php
,重写规则循环RewriteCond %{ENV:REDIRECT_STATUS} 200
RewriteRule ^ - [L]
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:哦,太酷了!谢谢你的评论!!:)真是天才!非常感谢你,林琼恩!谢谢你花时间详细解释!你现在真的教会了我很多!真是天才!非常感谢你,林琼恩!谢谢你花时间详细解释!你现在真的教会了我很多!