RewriteRule创建500内部服务器错误

13

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

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

我想要实现的是:

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

但以上代码会导致500内部服务器错误。

有人知道我做错了什么吗?


2
一个500错误通常意味着某个地方已经记录了一个错误。找到您的Apache和PHP错误日志,查看实际错误是什么。 - IMSoP
5
浏览器返回的500错误提示应该已经告知您完整的错误信息在服务器日志中,请阅读日志。 - Quentin
6个回答

27

由于您的匹配URI模式为:^directory/(.*)$,因此您的代码保证会生成500个内部服务器错误,因为它导致无限循环。这将匹配重写前和重写后的URL。一旦达到最大允许的内部重写限制,Apache就会抛出500个内部服务器错误并退出。

请将您的代码更改为:

Options +FollowSymLinks -MultiViews
# Turn mod_rewrite on
RewriteEngine On

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

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


1
只是想补充一下,我没有意识到我的重写规则也在引用自身。添加重写条件解决了这个问题。这是一个显而易见但容易忽略的问题。 - Jarrod Christman
1
我遇到了同样的问题。我以为是[或]运算符,花了很长时间,最后看了你的答案,发现是循环。你是我的救星。谢谢。 - Abadis

19

我遇到了相同的问题,发现在我的情况下“rewrite”模块尚未启用。因此,我需要启用它,然后重启apache服务器:

  • 启用“rewrite”模块:sudo a2enmod rewrite
  • 然后重新启动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


好的,服务器错误已经解决了,但现在我得到了“请求的URL /directory/10在该服务器上未找到。”有什么想法? - Tom
好的,现在听起来像是重写没有匹配。 - Paul S
在您的虚拟主机中添加一个RewriteLog(它们在.htaccess中无效),指向您想要写入的日志文件。我已经编辑了我的答案,并提供了一个示例。 - Paul S
你的解决方案无法生效,因为RewriteRule在.htaccess文件中不匹配前导斜杠。 - anubhava

0

又是一天在 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]

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”。


0

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

因为默认情况下它被禁用/注释掉了


1
嗨,感谢您的回答。如果您能解释为什么以及如何解决OP的问题,那将极大地帮助每个人! - Simas Joneliunas
因为默认情况下它被禁用/注释了。 - erwin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接