【问题标题】:RewriteRule creating 500 Internal Server ErrorRewriteRule 创建 500 内部服务器错误
【发布时间】:2013-06-11 01:41:42
【问题描述】:

我的 .htaccess 文件中有以下内容:

Options +FollowSymLinks
RewriteEngine on
RewriteRule ^directory/(.*)$ directory/index.php?id=$1

我想要实现的是:

当访问 URL www.mydomain.com/directory/10 时,页面www.mydomain.com/directory/?id=10 会显示在浏览器上,而不会改变 URL 的外观。

上面的代码创建了一个 500 内部服务器错误。

有人知道我哪里出错了吗?

【问题讨论】:

  • 500 错误通常表示某处记录了错误。找到你的 Apache 和 PHP 错误日志,看看实际的错误是什么。
  • 发送到浏览器的 500 错误应该已经通知您完整的错误消息将在服务器日志中。阅读它们。

标签: php regex apache .htaccess mod-rewrite


【解决方案1】:

您的代码保证会产生 500 内部服务器错误,因为它会导致无限循环。原因是您匹配的 URI 模式是:^directory/(.*)$

在重写前后匹配您的网址。一旦达到允许的最大内部重写限制,Apache 就会抛出 500 个内部服务器错误并退出。

将您的代码更改为:

Options +FollowSymLinks -MultiViews
# Turn mod_rewrite on
RewriteEngine On
RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^directory/(.*)$ /directory/index.php?id=$1 [L,QSA,NC]

上面的代码有一个额外的RewriteCond %{REQUEST_FILENAME} !-f,它将确保在第一次之后禁止后续执行 RewriteRule,因为/directory/index.php 将是一个有效文件。

【讨论】:

  • 只是想补充一点,我没有意识到我的重写规则也在引用自己。添加重写条件解决了这个问题。显而易见但容易被忽视的东西。
  • 有同样的问题。我以为是 [OR] 操作数,花了太多时间,终于阅读了您的答案并找到了循环。你是我的天使。谢谢
【解决方案2】:

我遇到了同样的问题,发现在我的情况下“重写”模块尚未启用。所以我需要启用它,然后重新启动 apache 服务器:

  • 启用“重写”模块:sudo a2enmod 重写
  • 然后重启apache服务器:sudo service apache2 restart

希望这对任何人都有帮助。

【讨论】:

    【解决方案3】:

    您应该尝试在前面添加一个正斜杠:

    RewriteRule ^/directory/(.*)$ directory/index.php?id=$1
    

    我以前也遇到过这种情况。

    或者使用 RewriteLog 和 RewriteLogLevel 进行调试,并查看 Apache 错误和访问日志以获取更多信息:

    RewriteLogLevel 3
    RewriteLog ${APACHE_LOG_DIR}/rewrite.log
    

    这将在您的 apache 日志目录中留下一个日志文件。在我的情况下是/var/log/apache

    【讨论】:

    • 好吧,服务器错误已解决,但现在我得到The requested URL /directory/10 was not found on this server. 任何想法?
    • 好吧,现在听起来 Rewrite 不匹配。
    • 在您的虚拟主机中添加一个 RewriteLog(在 .htaccess 中无效)以指向您希望写入的日志文件。我已经用一个例子编辑了我的答案。
    • 您的解决方案无法工作,因为 RewriteRule 与 .htaccess 中的前导斜杠不匹配。
    【解决方案4】:

    如果您使用 CodeIgniter 并且遇到错误问题 500。请按照解决方案。

    所以要在 CodeIgniter 中删除 URL 的“index.php”段,你需要做 2 件事。首先是编辑/system/application/config/config.php文件,将index_page策略的值改为空:

    $config['index_page'] = '';
    

    第二步,创建文件.htaccess

    RewriteEngine on
    RewriteCond $1 !^(index\.php|images|robots\.txt)
    RewriteRule ^(.*)$ index.php/$1 [L]
    

    就是这样!从现在开始,您使用 CodeIgniter 制作的站点/系统的 URL 将不再具有线程(被某些人称为“烦人”)“index.php”。

    【讨论】:

      【解决方案5】:

      又是一天在 Apache 上搜索一个奇怪的错误。 在我的 Docker Apache 2.4.48 alpine 容器上工作。但尚未投入生产。

      这是区别(只是一个点):

      不适用于托管服务提供商

      RewriteRule ^public/(.*)$ ./public/index.php?route=/$1 [L,QSA]
      

      与托管服务提供商合作

      RewriteRule ^public/(.*)$ /public/index.php?route=/$1 [L,QSA]
      

      【讨论】:

        【解决方案6】:

        只需取消注释#LoadModule rewrite_module lib/httpd/modules/mod_rewrite.so

        【讨论】:

        • 您好,感谢您的回答。如果您能解释这个答案为什么以及如何解决 OP 的问题,我相信这将对每个人都有很大帮助!
        猜你喜欢
        • 2014-01-01
        • 2015-09-30
        • 2016-11-29
        • 2019-01-17
        • 2011-10-17
        • 2010-11-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多