我正在向使用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?
1条答案
按热度按时间doinxwow1#
我认为您只是缺少了标准的前端控制器模式...实际上将
controller_name/function_name/$param1/$param2
的URL重写为CI前端控制器(即index.php
)。否则,这样的请求将直接落入Apache 404,因为没有任何东西来处理该请求(现有的规则都不匹配这样的请求)。例如,尝试在最后一个
RewriteRule
指示词 * 之后 *(以及RedirectMatch
指示词 * 之前 *)加入下列指令。这会将URL路径作为查询字符串传递给
index.php
。根据CI的配置方式,您可能需要将其作为PATH_INFO传递(即忽略?
)。例如:或者简单地删除后面的
/$1
,让CI使用PHP的$_SERVER['REQUEST_URI']
。例如:任何符合先前规则的现有URL都将具有优先权。