RewriteRule创建500内部服务器错误

时间:2013-06-14 11:56:33

标签: php apache .htaccess mod-rewrite

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

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

我想要实现的目标是:

访问网址www.mydomain.com/directory/10时,浏览器会显示页面www.mydomain.com/directory/?id=10,而不会更改网址的外观。

上述代码会产生500内部服务器错误。

有谁知道我哪里出错了?

5 个答案:

答案 0 :(得分:17)

您的代码保证会生成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将是一个有效的文件。

答案 1 :(得分:14)

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

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

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

答案 2 :(得分:2)

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

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

之前我已经被发现了。

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

RewriteLogLevel 3
RewriteLog ${APACHE_LOG_DIR}/rewrite.log

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

答案 3 :(得分:0)

如果您正在使用CodeIgniter并且出现错误问题500.请按照解决方案进行操作。

因此,要删除CodeIgniter中URL的“index.php”段,您需要做两件事。第一种是编辑/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”。

答案 4 :(得分:0)

另一天在 Apache 上搜索一个奇怪的错误。 在我的 Docker Apache 2.4.48 高山容器上工作。但不是在生产中。

区别如下(只是一个点):

不适用于托管服务提供商

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

与托管服务提供商合作

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