.htaccess规则500内部服务器错误

.htaccess规则500内部服务器错误,.htaccess,mod-rewrite,.htaccess,Mod Rewrite,使用此选项: 我不得不重写 www.example.com/index.php?p=page 到 出于某种原因,无论我访问哪个站点,这都会导致500个内部服务器错误: www.example.com www.example.com/page www.example.com/index.php?p=page 规则: 需要添加a/so: RewriteEngine On RewriteRule ^/([^/]*)$ /index.php?p=$1 [L] 这将导致一个重写循环(因此出现500

使用此选项:

我不得不重写

www.example.com/index.php?p=page

出于某种原因,无论我访问哪个站点,这都会导致500个内部服务器错误:

  • www.example.com

  • www.example.com/page

  • www.example.com/index.php?p=page

规则:

需要添加a/so:

RewriteEngine On
RewriteRule ^/([^/]*)$ /index.php?p=$1 [L]
这将导致一个重写循环(因此出现500错误)。防止重写循环的一种方法是,在尝试重写之前检查URL是否尚未包含
p
URL参数。例如:

RewriteCond %{QUERY_STRING} !^p=
RewriteRule ^([^/]*)$ /index.php?p=$1 [L]

.htaccess
中,在
重写规则
模式的开头添加斜杠不会“修复”问题,它只会使错误消失-因为现在这样做不会起任何作用。请检查服务器的错误日志。错误的原因将在那里。您很可能缺少使用
mod_rewrite
指令所需的覆盖(即
FileInfo
)(或者
mod_rewrite
实际上未启用)这如何创建循环?
L
标志应该防止这种情况发生在
.htaccess
L
标志只是停止当前一轮处理。这个过程会再次启动并继续,直到URL不变地通过。但这是一个内部重写。没有其他请求。我想你需要测试一下你的电脑assumptions@Phil您是否按照编写的方式进行测试,在替换项上使用斜杠前缀?这肯定会导致“请求超过10个内部重定向的限制…”(我怀疑是因为URL,而不是文件系统路径?)-请注意,这是一个“内部”重写循环,而不是一个外部“重定向循环”。正如你所说,“没有其他要求”。删除斜杠前缀可以避免“无限”重写循环(允许重新添加目录前缀-现在是文件系统路径),但这仍然会导致两次重写,从而有效地“中断”请求…@Phil,例如,没有斜杠前缀,对
/test
的请求被重写为
index.php?p=test
,该请求被重写为
index.php?p=index.php
,这显然不是期望的结果。但是,如果包含斜杠前缀(如上所述),则该过程似乎会继续,试图永远重写到相同的URL
/index.php?p=index.php
,直到服务器中断并出现“请求超出限制…”
RewriteEngine On
RewriteRule ^/([^/]*)$ /index.php?p=$1 [L]
RewriteRule ^([^/]*)$ /index.php?p=$1 [L]
RewriteCond %{QUERY_STRING} !^p=
RewriteRule ^([^/]*)$ /index.php?p=$1 [L]