Php 重写规则创建500内部服务器错误

Php 重写规则创建500内部服务器错误,php,regex,apache,.htaccess,mod-rewrite,Php,Regex,Apache,.htaccess,Mod Rewrite,我的.htaccess文件中包含以下内容: Options +FollowSymLinks RewriteEngine on RewriteRule ^directory/(.*)$ directory/index.php?id=$1 我试图实现的是: 访问URLwww.mydomain.com/directory/10时,浏览器上会显示www.mydomain.com/directory/?id=10,而不会改变URL的外观 但是,上面的代码创建了一个500内部服务器错误 有人知道我哪里出错

我的.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内部服务器错误


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

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

RewriteRule ^/directory/(.*)$ directory/index.php?id=$1
我以前也被发现过

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

RewriteLogLevel 3
RewriteLog ${APACHE_LOG_DIR}/rewrite.log

这将在apache日志目录中留下一个日志文件。在我的例子中,即
/var/log/apache

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

它与重写前后的URL相匹配。一旦达到允许的最大内部重写限制,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
这将确保在自
/directory/index.php以来的第一次之后不允许后续执行重写规则将是一个有效的文件。

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

  • 启用“重写”模块:sudo a2enmod rewrite
  • 然后重新启动apache服务器:sudo服务apache2重新启动

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

如果您正在使用CodeIgniter并且出现错误问题。遵循解决方案

因此,要删除CodeIgniter中URL的“index.php”段,需要做两件事。第一个是编辑
/system/application/config/config.php
文件,将index\u page policy的值更改为空:

$config['index_page'] = '';
第二步是创建一个文件
.htaccess

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

就这样!从现在起,使用CodeIgniter创建的站点/系统的URL将不再有“index.php”线程(有些人称之为“恼人的”)。

500错误通常意味着某个地方记录了错误。找到Apache和PHP错误日志,看看实际的错误是什么。发送到浏览器的500错误应该已经通知您,完整的错误消息将出现在服务器日志中。阅读它们。这已经对服务器错误进行了排序,但是现在我得到了
在该服务器上找不到请求的URL/directory/10。
有什么想法吗?嗯,现在听起来好像重写不匹配。在vhost中添加一个重写日志(在.htaccess中无效)以指向要写入的日志文件。我已经用一个例子编辑了我的答案。您的解决方案无法工作,因为RewriteRule与.htaccess.中的前导斜杠不匹配。这太棒了!谢谢。我只是想补充一点,我没有意识到我的重写规则也引用了它自己。添加重写条件修复了该问题。显而易见但容易忽视的事情。