【问题标题】:Codeigniter and .htaccess mod rewriteCodeigniter 和 .htaccess mod 重写
【发布时间】:2017-07-15 17:57:39
【问题描述】:

我遇到了 mod rewrite 的问题。我也是它的初学者。我正在使用 CodeIgniter 并尝试重写以下内容:

http://url.dev/news/news_selection?item=59

看起来像这样:

http://url.dev/news/news_selection/59/

我遵循了以下教程:https://www.addedbytes.com/articles/for-beginners/url-rewriting-for-beginners/(更具体地说,是:“模式和替换”部分)

问题是我将我的 RewriteRule 编写如下,但在转到页面后它仍然没有重写 url(例如http://url.dev/news/news_selection?item=59

RewriteRule    ^news/news_selection/([0-9]+)/?$    news_selection?item=$1    [NC,L]

对我哪里出错有什么建议吗?谢谢。

我不确定路由和控制器是否会影响这个问题,但我添加了它们以供参考。

在我的 codeIgniter 路线中,我有

//_News Folder
$route['news/(:any)'] = 'pages/view2/_news/$1'; 
  • 1:_news 是文件夹

  • 2:news_selection是php文件

  • 3:页面是控制器

我的控制器对 view2 有以下功能:

public function view2($sub ='', $page='')
  {
          if ( ! file_exists(APPPATH.'/views/pages/'.$sub.'/'.$page.'.php'))
          {
                  // Whoops, we don't have a page for that!
                  show_404();
          }

          $data['title'] = ucfirst($page); // Capitalize the first letter

          $this->load->view('templates/header', $data);
          $this->load->view('pages/'.$sub.'/'.$page.'.php', $data);
          $this->load->view('templates/footer', $data);
  }

我的 .htaccess 的其余部分:

Options -Indexes
Options +FollowSymLinks
RewriteEngine On
RewriteBase /

#Removes access to the system folder by users.
#Additionally this will allow you to create a System.php controller,

RewriteCond %{REQUEST_URI} ^system.*
RewriteRule ^(.*)$ index.php?/$1 [L]

#When your application folder isn't in the system folder

RewriteCond %{REQUEST_URI} ^application.*
RewriteRule ^(.*)$ index.php?/$1 [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]

# If we don't have mod_rewrite installed, all 404's
# can be sent to index.php, and everything works as normal.
# Submitted by: ElliotHaughin

ErrorDocument 404 /index.php

【问题讨论】:

    标签: .htaccess codeigniter mod-rewrite


    【解决方案1】:

    你只需要这个来使用上面的url:

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

    您可以将它用于所有控制器。此文件 .htaccess 位于应用程序文件夹中。

    【讨论】:

    • 您能再深入一点解释一下吗?该网站可以正常使用:url.dev/news/news_selection?item=59 作为网址。我只想在你输入的地方清理它:url.dev/news/news_selection/59 并重写它以供通过。
    • 我对此了解不多。但是我读了一篇关于 CodeIgniter URL 的文章,如果你设置 $config['enable_query_strings'] = TRUE; 它将显示一个像查询字符串一样的 url。因为我第一次使用 CI,我的 url 是正常的,不像字符串。你可以阅读更多:link
    • 感谢您的帮助。这不是我的答案,因为它会破坏表单助手以及其他一些东西。我认为这是通过变量访问模型和视图的另一种方式。我终于弄清楚了该怎么做,并在下面发布了我的答案。
    【解决方案2】:

    我今天尝试了大约 10 个小时后才弄明白。

    我认为这可能是 CI 的路由问题,并决定尝试以清理后的格式从 url 传递我的变量。所以...

    如果我输入:http://url.dev/news/news_selection/59

    它将适用于以下路线:

    //_News Folder
    $route['news/news_selection/(:num)'] = 'pages/view_test/_news/news_selection/$1';
    

    和控制器:

      public function view_test($sub='', $page='', $var1='')
      {
              if ( ! file_exists(APPPATH.'/views/pages/'.$sub.'/'.$page.'.php'))
              {
                      // Whoops, we don't have a page for that!
                      show_404();
              }
    
              $data['item'] = $var1;
    
              $this->load->view('templates/header');
              $this->load->view('pages/'.$sub.'/'.$page.'.php', $data);
              $this->load->view('templates/footer');
      }
    

    通过使用这些,我可以将页码作为$var1 传递,然后通过$data 将其传递给我的视图。然后我在 news_selection.php 页面中将$data['item'] 选为$item 并将其传递给我的模型进行处理。 Reference to CI Manual for this.

    之后页面会像平常一样处理。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多