.htaccess RewriteRule创建500内部服务器错误

uujelgoq  于 2022-11-16  发布在  其他
关注(0)|答案(6)|浏览(168)

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

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

我想达到的目标是:
当URL www.example.com/directory/10被访问时,页面www.example.com/directory/?id=10被显示在浏览器上而不改变URL的外观。
上面的代码创建了一个500内部服务器错误。
有人知道我哪里错了吗?

olmpazwi

olmpazwi1#

您的代码肯定会生成500内部服务器错误,因为它会导致无限循环。原因是您的匹配URI模式为:^directory/(.*)$
在重写之前和之后匹配你的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,它将确保在第一次之后不允许RewriteRule的后续执行,因为/directory/index.php将是一个有效文件。

zz2j4svz

zz2j4svz2#

我也遇到了同样的问题,发现在我的例子中“rewrite”模块还没有启用。所以我需要启用它,然后重新启动apache服务器:

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

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

xghobddn

xghobddn3#

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

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

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

RewriteLogLevel 3
RewriteLog ${APACHE_LOG_DIR}/rewrite.log

这将在apache日志目录中留下一个日志文件。

ecfsfe2w

ecfsfe2w4#

如果您使用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”。

kqhtkvqz

kqhtkvqz5#

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

f87krz0w6#

只需取消#LoadModule rewrite_module的注解即可
因为默认情况下它被禁用/注解

相关问题