Yii - 从url中删除index.php - 始终重定向到' index.php'

时间:2013-10-18 08:36:32

标签: apache .htaccess yii url-rewriting

在我的测试应用中,我正在尝试从网址中删除index.php。我可以像http://localhost/trackstar/而不是http://localhost/trackstar/index.php那样访问根页面,但是当我尝试访问另一个页面时,如http://localhost/trackstar/project或任何其他页面,我总是会在index.php页面。但是,打开http://localhost/trackstar/index.php/project会有效。

我正在使用WAMP服务器。配置如下。

启用了apache中的重写模块。 配置main

'urlManager' => array(
        'urlFormat' => 'path',            
        'rules' => array(
            'commentfeed' => array('comment/feed', 'urlSuffix' => '.xml', 'caseSensitive' => false),
            '<controller:\w+>/<id:\d+>' => '<controller>/view',
            '<controller:\w+>/<action:\w+>/<id:\d+>' => '<controller>/<action>',
            '<controller:\w+>/<action:\w+>' => '<controller>/<action>',
        ),
        'showScriptName' => false,
    ),
项目的根文件夹中的

.htaccess

Options +FollowSymlinks
IndexIgnore */*
RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php

我还添加了httpd.conf,虽然我认为并非真的有必要:

<Directory "c:/wamp/www/TrackStar/">
  Options Indexes FollowSymLinks
  AllowOverride All
  Order allow,deny
  allow from all
</Directory>

我在.htaccess中尝试了多个额外参数的组合,但我一直被重定向到我的index.php页面。

关于为什么这不起作用的任何想法?

修改

由于我被重定向,RewriteCond中的检查不成功,换句话说,找不到REQUEST_FILENAME作为目录或文件。也许在我的目录结构中有一些东西?

enter image description here

TrackStar\protected\views\project目录,例如我正试图通过http://localhost/trackstar/project访问的页面。我的Yii框架文件位于www文件夹上方的目录中。

4 个答案:

答案 0 :(得分:1)

尝试在RewriteEngine on之后添加.htaccess:

RewriteBase /trackstar/

问题在于:当找不到文件时,它会重定向到http://localhost/index.php,在请求http://localhost/trackstar/index.php/project文件index.php中找到并且它可以正常工作

更新: 尝试修改您的urlManager设置(添加/trackstar/):

'urlManager' => array(
    'urlFormat' => 'path',            
    'rules' => array(
        'commentfeed' => array('comment/feed', 'urlSuffix' => '.xml', 'caseSensitive' => false),
        '/trackstar/<controller:\w+>/<id:\d+>' => '<controller>/view',
        '/trackstar/<controller:\w+>/<action:\w+>/<id:\d+>' => '<controller>/<action>',
        '/trackstar/<controller:\w+>/<action:\w+>' => '<controller>/<action>',
    ),
    'showScriptName' => false,
),

答案 1 :(得分:0)

你可以尝试:

项目根文件夹中的

.htaccess:

Options +FollowSymlinks -MultiViews

IndexIgnore */*
DirectoryIndex index.php

RewriteEngine On

RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^(.*?)index\.php$ /$1 [L,NC,R=302]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php [L]

答案 2 :(得分:0)

你可以通过两个简单的步骤来做到这一点。

  1. 配置config / main.php中的'urlManager'看起来像这样

            'urlManager'=>array(
                'urlFormat'=>'path',
                'showScriptName'=>false,      
            ),
    
  2. 使用以下代码

    在应用程序的根目录下添加.htaccess文件
    Options +FollowSymLinks
    IndexIgnore */*
    RewriteEngine on
    
    # if a directory or a file exists, use it directly
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    
    # otherwise forward it to index.php
    RewriteRule . index.php
    
  3. 多数民众赞成!

答案 3 :(得分:0)

更改你的config / main.php,如下所示:

'urlManager'=>array(
        'urlFormat'=>'path',
        'showScriptName'=>false,
        'caseSensitive'=>false,
        'rules'=>array(
            '<controller:\w+>/<id:\d+>'=>'<controller>/view',
            '<controller:\w+>/<action:\w+>/<id:\d+>'=>'<controller>/<action>',
            '<controller:\w+>/<action:\w+>'=>'<controller>/<action>',
        ),

然后将你的htaccess文件放在带有受保护文件夹的基本目录下(可能在受保护的文件夹中),将代码放在你的htaccess文件下面

RewriteEngine on
# if a directory or a file exists, use it directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

# otherwise forward it to index.php
RewriteRule . index.php

或试试这个---

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)\?*$ index.php/$1 [L,QSA]

完成...希望它能够运作