在CodeIgniter中覆盖.htaccess中的重写规则

xurqigkl  于 2022-11-16  发布在  其他
关注(0)|答案(1)|浏览(179)

我正在向使用CodeIgniter创建的现有网站添加一些功能。
我们通常使用CI的默认路由,但网站的前开发人员,正如我看到的代码,试图重新发明车轮。
通常CI认为路由的第一个参数是控制器名称,斜杠后的第二个参数是函数名称,后面的参数是函数参数。但这个家伙可能不知道,现在网站是一个整体混乱。特别是路由逻辑是可怕的。
他的.htaccess文件如下:

RewriteEngine on 

DirectoryIndex index.php

RewriteRule ^google[0-9a-f]+.html$ - [L]

RewriteRule ^(shop.html)$   index.php?mod=shop&name=$1 [L,NC]

RewriteRule ^(ref.html)$   index.php?mod=ref&name=$1 [L,NC]

RewriteRule ^(refs.html)$   index.php?mod=aff&s=refs&ad=$2  [L,NC]

RewriteRule ^(vip-membership.html)$   index.php?mod=aff&s=top [L,NC]

RewriteRule ^(dds.html)$   index.php?mod=aff&s=dds [L,NC]

RewriteRule ^(news.html)$   index.php?mod=news [L,NC]

RewriteRule ^(document)-(.*)-(.*).html$   index.php?mod=aff&s=document&id=$3 [L,NC]

RewriteRule ^(category)-(.*)-(.*).html$   index.php?mod=aff&s=category&top=$3 [L,NC]

RewriteRule ^(news)_(.*)_(.*).html$   index.php?mod=news&s=detail&name=$1&id=$2 [L,NC]

RewriteRule ^(.*)_news.html$   index.php?mod=news&s=category&catname=$1&id=$2 [L,NC]

RewriteRule ^(page)-(.*).html$   index.php?mod=aff&s=page&name=$2 [L,NC]

RewriteRule ^([a-z0-9_-]+).html$   index.php?mod=page&name=$1 [L,NC]

RewriteRule ^([a-z0-9_-]+).html$   index.php?mod=page&name=$1 [L,NC]

 

RedirectMatch 301 ^/panel$ /index.php/panel

RedirectMatch 301 ^/2017-books.html$   /dhtc-2017-books.html



php_value max_input_vars 3000
php_value suhosin.get.max_vars 3000
php_value suhosin.post.max_vars 3000
php_value suhosin.request.max_vars 3000

我想做的是提供搜索引擎优化友好的网址,如controller_name/function_name/$param1/$param2
我希望这个.htaccess可以正常工作,但它也应该允许我编写自己的url。

RewriteRule ^([a-z0-9_-]+).html$

会做自己的工作,但不会干扰我的网址一样

$route['download/(:any)/(:any)/(:any)'] = '/controller/download/$1/$2/$3';

我在routes.php中有一些路径。我不认为它们被考虑在内。
在我的控制器中有一个下载方法得到3个参数:

  • $1:文件夹名称,
  • $2:文件ID和
  • $3:文件名

防止任何冲突我如何添加新的规则到这个.htaccess?

doinxwow

doinxwow1#

我认为您只是缺少了标准的前端控制器模式...实际上将controller_name/function_name/$param1/$param2的URL重写为CI前端控制器(即index.php)。否则,这样的请求将直接落入Apache 404,因为没有任何东西来处理该请求(现有的规则都不匹配这样的请求)。
例如,尝试在最后一个RewriteRule指示词 * 之后 *(以及RedirectMatch指示词 * 之前 *)加入下列指令。

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*) index.php?/$1 [L]

这会将URL路径作为查询字符串传递给index.php。根据CI的配置方式,您可能需要将其作为PATH_INFO传递(即忽略?)。例如:

:
RewriteRule (.*) index.php/$1 [L]

或者简单地删除后面的/$1,让CI使用PHP的$_SERVER['REQUEST_URI']。例如:

:
RewriteRule . index.php [L]

任何符合先前规则的现有URL都将具有优先权。

相关问题