簡體   English   中英

Phalcon,IIS 7.5和URL重寫問題

[英]Phalcon, IIS 7.5 and URL Rewrite problems

因此,我在此鏈接http://docs.phalconphp.com/en/latest/reference/tutorial.html上關注Phalcon php教程,但是我試圖使用IIS 7.5(而不是apache)來重新創建該過程。 ),並且出現以下添加/錯誤行為。

注意:服務器名稱和端口是我通過IIS 7.5在本地創建的,因此如果您單擊它或將其復制並粘貼到瀏覽器地址欄中,它不會做任何有意義的事情。

場景1:
瀏覽器地址欄輸入: http://Phalcon:8181/
瀏覽器地址欄結果: http://Phalcon:8181/public/public/public/public/public/...[ad_nauseaum]../public/ (不是預期的結果。應該是http://Phalcon:8181/index/index因為它們在“ bootstrap” index.php文件中設置為默認值)
瀏覽器頁面結果:預期頁面(/public/index.php,然后路由到/public/controllers/index.php並默認使用操作“ index”)

場景2:
瀏覽器地址欄輸入: http://Phalcon:8181/index.php
瀏覽器地址欄結果: http://Phalcon:8181/index.php (不是預期的結果。它應該是http://Phalcon:8181/index/index因為它們在“ bootstrap”索引中設置為默認值。 php文件)
瀏覽器頁面結果:預期頁面(/public/index.php,它路由到正確的控制器和操作)

場景3:
瀏覽器地址欄輸入: NONE
用戶采取的行動:單擊Phalcon生成的鏈接並指向“ singup / index”
瀏覽器地址結果: http://Phalcon:8181/public/signup/index (不是預期的結果,我期望http://Phalcon:8181/signup/index因為它們均在Phalcon生成的鏈接中提供)

我嘗試弄亂web.configs或bootstrap php,但是我所做的所有其他更改都導致404-IIS中找不到頁面錯誤

基於他們的“創建項目->文件結構”部分,我如下創建了我的站點文件夾結構:

tutorial/
  app/
    controllers/
    models/
    views/
  public/
    css/
    img/
    js/

文件夾“ tutorial”是我在IIS 7.5中創建的網站的根目錄

在“漂亮的URL”部分中,它描述了如何重定向請求,以便它們與Phalcon提供的MVC模式一起使用。

所以這個改mod

<IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteRule  ^$ public/    [L]
    RewriteRule  (.*) public/$1 [L]
</IfModule>  

將IIS轉換為web.config文件中“ tutorial”文件夾中的內容:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <rewrite>
            <rules>
                <rule name="Imported Rule 1" stopProcessing="true">
                    <match url="^$" ignoreCase="false" />
                    <action type="Rewrite" url="public/" />
                </rule>
                <rule name="Imported Rule 2" stopProcessing="true">
                    <match url="(.*)" ignoreCase="false" />
                    <action type="Rewrite" url="public/{R:1}" />
                </rule>
            </rules>
        </rewrite>
    </system.webServer>
    <location path="public">
    </location>
</configuration>  

而這個重寫國防部

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ index.php?_url=/$1 [QSA,L]
</IfModule>  

轉換為IIS,並放置在web.config文件中的“ tutorial / public”文件夾中:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <rewrite>
            <rules>
                <rule name="Imported Rule 3" enabled="true" stopProcessing="true">
                    <match url="^(.*)$" ignoreCase="false" />
                    <conditions logicalGrouping="MatchAll">
                        <add input="{REQUEST_FILENAME}" matchType="IsDirectory" ignoreCase="false" negate="true" />
                        <add input="{REQUEST_FILENAME}" matchType="IsFile" ignoreCase="false" negate="true" />
                    </conditions>
                    <serverVariables />
                    <action type="Rewrite" url="index.php?_url=/{R:1}" appendQueryString="true"    />
                </rule>
            </rules>
        </rewrite>
    </system.webServer>
</configuration>  

至於應該用來處理路由的PHP引導文件,它具有下面的代碼(它位於index.php的“ public”文件夾中:

<?php
    try{

        // create a router
        $router = new \Phalcon\Mvc\Router();
        $router->setDefaultController("index");
        $router->setDefaultAction("index");
        $router->add("/public", array(
                "controller" => "index",
                "action" => "index"
            ));
        $router->notFound(array(
                "controller" => "index",
                "action" => "route404"
            ));

        // Register an autoloader
        $loader = new \Phalcon\Loader();
        $loader->registerDirs(array(
                '../app/controllers/',
                '../app/models/'
            ))->register();

        // Create a DI
        $di = new \Phalcon\DI\FactoryDefault();

        // Setup the view component
        $di->set('view', function(){
            $view = new \Phalcon\Mvc\View();
            $view->setViewsDir('../app/views/');
            return $view;
        });

        // Setup a basic URI so that all generated URIs includ the tutorial folder
        $di->set('url', function(){
            $url = new \Phalcon\Mvc\Url();
            $url->setBaseUri('/public/');
            return $url;
        });

        // Handle the request
        $application = new \Phalcon\Mvc\Application($di);

        echo $application->handle()->getContent();

    } 
    catch (\Phalcon\Exception $e)
    {
        echo "PhalconException: " , $e->getMessage();
    }

?>

關於如何使這項工作無縫進行的任何想法?

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <rewrite>
            <rules>
                <rule name="Imported Rule 1" stopProcessing="true">
                    <match url="^$" ignoreCase="false" />
                    <action type="Rewrite" url="public/" />
                </rule>
                <rule name="Imported Rule 2" stopProcessing="true">
                    <match url="^(public/)?([^/]+)$" ignoreCase="false" />
                    <conditions>
                        <add input="C:\inetpub\wwwroot\<projectpath>\public\{R:2}" matchType="IsFile" />
                    </conditions>
                    <action type="Rewrite" url="public/{R:2}" appendQueryString="true" />
                </rule>
                <rule name="Imported Rule 3" stopProcessing="true">
                    <match url="(.*)" ignoreCase="false" />
                    <action type="Rewrite" url="public/index.php?_url={R:1}" appendQueryString="true" />
                </rule>
            </rules>
        </rewrite>
    </system.webServer>
</configuration>

放在項目根目錄中,這將復制phalcon create-project <projectname>生成的兩個.htaccess文件的效果。 只需要一個web.config ,而不是兩個。

注意: <projectpath>不是變量!
我找不到一種引用當前路徑的優雅方法,因此盡管C:\\inetpub\\wwwroot可以寫為{DOCUMENT_ROOT}<projectpath>仍需要顯式鍵入<projectpath> (例如, projects/my_phalcon_project )。

評論:
web.config確實確實非常強大,但是我發現它比更簡潔的.htaccess更加難以理解。 如果不先閱讀在線文檔和示例,我不能只接受您的內容並進行修改。 由於某些行為既沒有記錄也沒有直觀性,因此還涉及反復試驗。


使用與上面類似的web.config ,我能夠完成IIS 8.5上的Phalcon 教程 但是,在其首先定義$url->setBaseUri('/');的指令中似乎存在不一致$url->setBaseUri('/'); ,然后顯示瀏覽器訪問localhost/tutorial/的屏幕截圖。 顯然,它應該是$url->setBaseUri('/tutorial/'); 對於可通過localhost/tutorial/訪問的項目。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM