【问题标题】:Yii url routing not working on Mac OS XYii url 路由在 Mac OS X 上不起作用
【发布时间】:2014-03-23 23:33:16
【问题描述】:

我是 php 和 Yii 的新手,这可能是一个非常愚蠢的问题。我在 Mac OS X 上使用 Yii 框架来开发 Web 应用程序。我正在处理的代码库是在 Windows 机器上设置的,并且在 Windows 操作系统上运行良好。但是,当我尝试在我的 Mac OS X 上运行它时,我收到 404 not found 错误。 main.php 配置文件中的 url 路由似乎有问题。

我的网址管理器有以下代码

    'urlManager'=>array(
        'showScriptName'=>false,
        'caseSensitive'=>true,
        'urlFormat'=>'path',
        'rules'=>array(

            '' => 'home',
            'learn-more' => 'home/learn_more',
            'cpi'  => 'cpi/index',
            '<controller:\w+>/<action:\w+>' => '<controller>/<action>',
            '<controller:\[\w\-]+>/<action:\[\w\-]+>/<id:\d+>'=>'<controller>/<action>',
            '<controller:\[\w\-]+>/<action:\[\w\-]+>/<code:\w+>'=>'<controller>/<action>',
            '<controller:\[\w\-]+>/<action:\[\w\-]+>'=>'<controller>/<action>',
        ),
    ),

我的文件夹结构是这样的

> protected
    > components
    > config
    > controllers
    > views
        > about
        > careers
        > contact
        > cpi
        > devadmin
        > error
        > home
        > info
        > layouts

项目文件夹中的.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

我的主页http://mysite.com 必须映射到 /home/index(即 HomeController 中的索引操作),这样可以完美运行。 “views”下的每个其他文件夹都有一个 index.php 文件。我需要将http://mysite.com/devadmin 类型的url 映射到/devadmin/index。现有规则在 Windows 操作系统下运行时运行良好,但在我的 Mac 操作系统上给我一个错误。我想知道我的网址管理器中是否有任何特定于 Windows 的代码。如果有人能建议我解决这个问题,我会很高兴。

【问题讨论】:

  • 你有 devadmin 控制器吗?它不会直接映射到 View 文件夹,而是映射到控制器和操作,即呈现视图的操作。
  • @Pitchinnate 是的,我在控制器文件夹中有一个 devadmin 控制器(DevadminController.php),它有一个动作(actionIndex),这个动作在成功登录时呈现主页。如果我使用 url mysite.com/index.php?r=devadmin/index,那么页面会正确呈现。我正在尝试找到一种解决方案,通过该解决方案可以使用 url sndev:8080/devadmin 呈现页面。
  • sndev:8080/devadmin/index 工作吗?如果是这样,请在下面查看我的答案。
  • 如果没有,其他页面是否像sndev:8080/careers/index一样工作?
  • @Pitchinnate No sndev:8080/devadmin/index 不起作用。它给了我一个 404 Not Found 错误。 sndev:8080/careers/index 等其他页面也不起作用。我尝试了您的解决方案,但似乎也不起作用。

标签: php url-rewriting yii url-routing


【解决方案1】:

尝试做这样的事情:

'urlManager' => array(
    'showScriptName' => false,
    'caseSensitive'  => true,
    'urlFormat'      => 'path',
    'rules'          => array(
        ''                                 => 'home',
        'learn-more'                       => 'home/learn_more',
        'cpi'                              => 'cpi/index',
        '<controller>/<action>/<id:\d+>'   => '<controller>/<action>',
        '<controller>/<action>/<code:\w+>' => '<controller>/<action>',
    ),
),

我不知道您的要求。如果对您没有帮助,请尝试在您的问题中添加更多详细信息。

【讨论】:

  • 当我转到 mysite.com/index.php?r=devadmin/index 时,页面正确呈现。但我正在尝试使用 url mysite.com/devadmin 呈现页面。你能告诉我你需要的任何细节来建议我一个解决方案吗?
  • 上面的 urlmanager 对我不起作用。由于我的问题中提到的 urlManager 在 Windows 机器上工作,我认为其中可能有一些代码不适用于 Mac OS 和 linux OS。
  • 是的,我在路由方面也遇到了同样的问题。寻找解决方案。 =\ 路由斜线或某种类似的问题(我认为)存在一些问题。
【解决方案2】:

如果您希望它在最后没有 /index 的情况下适用于 domain.com/devadmin,您需要向您的 URL 管理器添加另一条规则:

        '' => 'home',
        'learn-more' => 'home/learn_more',
        'cpi'  => 'cpi/index',
        '<controller:\w+>' => '<controller>/index', //this is the line you need to add
        '<controller:\w+>/<action:\w+>' => '<controller>/<action>',
        '<controller:\[\w\-]+>/<action:\[\w\-]+>/<id:\d+>'=>'<controller>/<action>',
        '<controller:\[\w\-]+>/<action:\[\w\-]+>/<code:\w+>'=>'<controller>/<action>',
        '<controller:\[\w\-]+>/<action:\[\w\-]+>'=>'<controller>/<action>',

【讨论】:

    【解决方案3】:

    尝试查看您的主机配置文件。例如在 *nix-like 操作系统中它有自己的(一个主机一个文件)文件,现在让我们看看

    (我的,你会有另一个)

    <VirtualHost *:80>
        ServerAdmin webmaster@localhost
        ServerName *ServerName*
        DocumentRoot /home/nick/public_html/sitefolder
    
        # this one is for any folder without rules
        <Directory />
            Options FollowSymLinks
            AllowOverride None
        </Directory>
    
        # this one for custom folder
        <Directory /home/nick/public_html/sitefolder/>
            Options Indexes FollowSymLinks MultiViews
            AllowOverride All # this one we need to change!
            Order allow,deny
            allow from all
        </Directory>
    
        ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
        <Directory "/usr/lib/cgi-bin">
            AllowOverride None
            Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
            Order allow,deny
            Allow from all
        </Directory>
    
        ErrorLog ${APACHE_LOG_DIR}/error.log
    
        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn
    
        CustomLog ${APACHE_LOG_DIR}/access.log combined
    </VirtualHost>
    

    这是默认配置文件。但是你应该重新检查

    1. 服务器名称;
    2. 文件夹\目录;
    3. 在您的根目录中,您应该设置“AllowOverride All”,这很重要,否则 .htaccess 将不起作用。在我们的例子中,我指的是第二个目录 (&lt;Directory /home/nick/public_html/sitefolder/&gt;) 规则,而不是第一个!

    它帮助我获得了正确的 url 路由。

    PS:是的,我知道我们可以进行更多更改以使我们的主机更安全,但现在我们谈论的是不使用 Yii 的路由(和 mod_rewrite)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-06
      • 2014-10-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多