如何修复mod_rewrite正则表达式产生500和404错误

时间:2013-01-13 03:20:42

标签: regex .htaccess get

我的.htaccess

中有以下一行
RewriteRule ^folder/(.*)$ /folder/?value=$1 [L]

http://website.com/folder/value处有任何内容时,这总是给我500个内部错误。

如果我只是将其改为

RewriteRule ^folder/(.*)\.html$ /folder/?value=$1 [L]

它正确地将我发送到http://website.com/folder/value.html,并在$ _GET中设置了value.html。

我希望能够接受诸如value,value.com,value-4,otheritem之类的任何内容。

关于为什么我的正则表达式每次都是500内部服务器错误的任何想法?

3 个答案:

答案 0 :(得分:2)

您可能会收到500个错误,因为您的规则正在循环播放。规则的目标与模式本身匹配(/folder/?value=value匹配^folder/(.*)$,因为查询字符串在匹配之前被剥离)。尝试包括适用于规则的条件,例如:

RewriteCond %{REQUEST_FILENAME !-f
RewriteCond %{REQUEST_FILENAME !-d
RewriteRule ^folder/(.*)$ /folder/?value=$1 [L]

或者:

RewriteCond %{REQUEST_URI} !^/folder/?$
RewriteRule ^folder/(.*)$ /folder/?value=$1 [L]

但从技术上来说@Suku建议应该有效:

RewriteRule ^folder/(.+)$ /folder/?value=$1 [L]

在我的测试apache实例中,所有上述工作都在RewriteRule ^folder/(.*)$ /folder/?value=$1 [L]循环(并返回500)。

答案 1 :(得分:1)

您可以尝试使用此方法将/foldervalue(键值“值”)视为动态字符串,无论其格式如何。

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI}  .*/([^/]+)/([^/]+)/?   [NC]
RewriteRule .*       %1/?value=%2      [L]

它在内部映射一个像这样的URL:

http://website.com/anyfolder/anyvalue

http://website.com/any/number/of/folders/anyfolder/anyvalue

要:

http://website.com/anyfolder/?value=anyvalue

当然/anyfolder必须存在于映射的网址中,否则会出现404错误。

此规则集在真实服务器中进行了测试,没有任何问题。

答案 2 :(得分:1)

以下是此规则的内容:

RewriteRule ^folder/(.*)$ /folder/?value=$1 [L]
  • 请求的网址/folder/test与模式匹配,并重写为/folder/?value=test
  • 由于[L]标志
  • ,重写停止

但是,由于路径/文件名已更改(/folder/test变为/folder/),因此mod_rewrite将执行另一次迭代:

  • 重写网址/folder/?value=test与模式匹配,并重写为/folder/?value=
  • 重复

正如其他评论/答案所述,将*更改为+,它应该可以解决问题。 如果/folder/存在且包含index.php ,则需要额外一行:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^folder/(.+)$ /folder/?value=$1 [L]

在重写之后,Apache会为现有目录提供默认文档,从而触发另一次重写迭代。该条件阻止mod_rewrite将/folder/index.php?value=test更改回/folder/?value=index.php