加入收藏 | 设为首页 | 会员中心 | 我要投稿 北几岛 (https://www.beijidao.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

php – mod_rewrite .htaccess如果URl不存在则导致500服务器错

发布时间:2021-07-06 05:22:45 所属栏目:大数据 来源: https://www.jb51.cc
导读:我刚刚开始使用mod_rewrite,这是我用于具有多种语言支持的非常基本的结构化网站: RewriteEngine onErrorDocument 404 /error404.PHPRewriteCond %{REQUEST_FILENAME} !-fRewriteCond %{REQUEST_FILENAME} !-dRewriteRule ^([a-zA-Z]{2})/([^/]+)$$2.PHP?lan

我刚刚开始使用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.如果没有字符串,则应将index用作默认值.

到现在为止还挺好.工作正常.只要我输入一个字符串(无论我是否使用2个字符作为语言),该站点始终显示500内部服务器错误,而不是转到error404.PHP.此外,如果我在.htaccess中删除此行(404),它仍然是相同的错误.

因此,我认为.htaccess中的其他行导致此错误有问题,是否有人知道这可能是什么?

任何帮助都非常感谢!

解决方法:

你的规则是循环的.乍一看,它看起来像你的最后一个:

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

假设我有这个URL,http://your.domain.com/blah,文件blah.PHP不存在.这就是发生的事情.

> URI = blah,! – f为true,它不是文件
> URI = blah,! – d为true,它不是目录
> URI = blah,内部重写为blah.PHP
> blah!= blah.PHP,重写规则循环
> URI = blah.PHP!-f为true,它不是文件
> URI = blah.PHP!-d为true,它不是目录
> 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]

(编辑:北几岛)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读