Codeigniter isn't routing right

杀马特。学长 韩版系。学妹 提交于 2019-11-30 20:59:07

It's possible that your routes aren't resolving correctly, but I'm not sure. I'd recommend the following steps.

First, I would just do away with using PATH_INFO for your CodeIgniter routing, as it's not necessary. Change your .htaccess file to this:

RewriteEngine On

RewriteCond $0 !^(index\.php|images|captcha|css|js|robots\.txt)
RewriteRule ^.*$ index.php [L]

Then, in your configuration, make sure that $config['uri_protocol'] is set to AUTO (the default, I believe) or REQUEST_URI.

Following that, the most likely cause is that your routes expect there to be a trailing slash on the URL. I don't know enough about CodeIgniter to know where that particular setting is configured, but you can cause your URLs to have a trailing slash with the following configuration directive:

$config['url_suffix'] = "/";

Edit: Make sure that mod_rewrite is working, as well. Try this at the top of your .htaccess file, after the RewriteEngine directive:

RewriteRule .* http://stackoverflow.com/ [L,R]

If you get redirected to Stack Overflow, at least we'll know that's working. If not, you aren't getting a 500 error, so the problem would lie with the .htaccess file, and in that case you should confirm that the corresponding <Directory> entry in your server configuration for where your site is located on disk has AllowOverride All set.

Edit: I should have known better about the forward slash, sorry about that. The problem occurs because of how mod_rewrite works in your per-directory (.htaccess) context.

Once your URL is rewritten, it is examined to determine what mod_rewrite should do with it. When your URL points to a local resource and contains a leading slash, mod_rewrite leaves it as-is. When it does not, it adds the per-directory prefix.

When it's left as-is, an internal redirect to /index.php, in this case, is assumed to be a fully-qualified URL from the host (localhost). So, the resource requested ends up being http://localhost/index.php. When the per-directory prefix is added, a later step in the rewrite engine attempts to remove the DocumentRoot from the path, if it's present. This leaves us with /kids/index.php, which is then passed to the internal redirect, and is resolved as expected.

Try this:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^(.*)$ /index.php/$1 [NC,L]

Put this in the kids folder where index.php is.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!