我的 Codeigniter 路由有问题,希望有人能提供帮助。路由在大多数情况下都可以正常工作,但在涉及子域时似乎会中断。我认为这与 htaccess 有关,但我真的完全不确定,希望有人能提供帮助。
如果我mysite.co.uk/a-page/
按预期进行这项工作。
如果我subdomain.mysite.co.uk
这样做也可以(我为子域加载了一个单独的 default_controller)。
如果有人按预期去subdomain.mysite.co.uk/anything
这个404。
但是,如果错误地有人去subdomain.mysite.co.uk/a-page/
这也应该 404 但它没有。相反,它更改为以下 URL:
http://www.subdomain.mysite.co.uk/index.php?/a-page/
然后加载“a-page”功能。我想要它到 404。奇怪的是探查器没有拾取上面的 URI。相反,它只是认为它是“一页”。
在我的配置中,我有以下内容:
$config['index_page'] = '';
$config['uri_protocol'] = 'AUTO';
$config['url_suffix'] = '/';
$config['permitted_uri_chars'] = 'a-z 0-9~%.:_\-';
我知道它并不理想,但对于子域检查,我在 routes.php 的底部执行以下操作
if(isset($_SERVER['HTTP_HOST'])){
$currentURL = parse_url('http://' . $_SERVER['HTTP_HOST']);
$urlHostPieces = explode('.', $currentURL['host']);
$subdomainValue = $urlHostPieces[1]; // will either be a genuine value or the domain name
}else{
$subdomainValue = DOMAIN;
}
if($subdomainValue !== DOMAIN){
//is subdomain
$route['default_controller'] = "controller/function/$subdomainValue";
} else{
//everything else
$route['default_controller'] = "controller/home";
}
我正在使用 Fabdrol 的 htaccess,这在谷歌搜索时似乎很常见。但是,我添加了尾部斜杠的代码并强制 www。
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
#Removes access to the system folder by users.
#Additionally this will allow you to create a System.php controller,
#previously this would not have been possible.
#'system' can be replaced if you have renamed your system folder.
RewriteCond %{REQUEST_URI} ^system.*
RewriteRule ^(.*)$ /index.php?/$1 [L]
#When your application folder isn't in the system folder
#This snippet prevents user access to the application folder
#Submitted by: Fabdrol
#Rename 'application' to your applications folder name.
RewriteCond %{REQUEST_URI} ^application.*
RewriteRule ^(.*)$ /index.php?/$1 [L]
# this adds trailing slash
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !(.*)/$
RewriteRule ^(.*)$ $1/ [R=301,L]
#Checks to see if the user is attempting to access a valid file,
#such as an image or css document, if this isn't true it sends the
#request to index.php
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?/$1 [L]
# Forces WWW
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]
</IfModule>
<IfModule !mod_rewrite.c>
# If we don't have mod_rewrite installed, all 404's
# can be sent to index.php, and everything works as normal.
ErrorDocument 404 /index.php
</IfModule>
有什么想法可以对奇怪的变化进行 404 处理吗?另请阅读 uri_protocol 应该更改为 REQUEST_URI 但这也没有影响它。
我还考虑过检查 uri 段。如果它存在,则只有 404,但即使该段不存在。就 CI 而言,就好像额外的字符串甚至不存在一样。
希望我没有错过任何东西。如果您需要更多示例代码,请随时说。
感谢您阅读并希望有人可以帮助并解释为什么会发生这种情况。