【问题标题】:How to fix mod_rewrite regex from producing 500 and 404 errors如何修复 mod_rewrite 正则表达式产生 500 和 404 错误
【发布时间】:2013-01-13 03:20:41
【问题描述】:

我的 .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,其中 value.html 在 $_GET 中设置。

我希望能够接受任何东西,例如 value、value.com、value-4、otheritem。

关于为什么我的正则表达式每次都是 500 Internal Server Error'ing 的任何想法?

【问题讨论】:

  • RewriteRule ^folder/(.+)$ /folder/?value=$1 [L] 像这样试试。 * 表示,ZEROMORE 匹配。 + 表示 ONEMORE
  • 不会改变任何东西。不过谢谢你的提示。
  • 你得到的是 404 还是 500?你的错误日志是怎么说的?
  • 嘿,当你这样做时你得到了什么:RewriteRule ^folder/(.+) /folder/?value=$1 [L]。我认为立即将$ 与通配符一起使用是没有意义的。所以试试^folder/(.+)
  • 500 错误,但是当我删除 $ 时,我得到 404。

标签: regex .htaccess get


【解决方案1】:

您可能会收到 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)。

【讨论】:

  • 嗯,检查日志我得到了重定向循环,但这些解决方案都没有解决它。仍然出现相同的 500 循环错误。
  • @Calvin 你还有其他规定吗?
  • 只是ErrorDocument 404 http://example.com/404ErrorDocument 403 http://example.com/403
【解决方案2】:

您可以尝试这种将/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必须存在映射的URL中,否则会出现404错误。

此规则集已在真实服务器中测试,没有问题。

【讨论】:

    【解决方案3】:

    下面是这条规则的结果:

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

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

    • 重写 URL /folder/?value=test 匹配模式并重写为/folder/?value=
    • 重复

    正如其他 cmets/answers 中所述,将 * 更改为 + 应该可以解决问题。 如果/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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-14
      • 2021-09-01
      相关资源
      最近更新 更多