【问题标题】:Force a specific Zend Framework controller via URL rewriting通过 URL 重写强制一个特定的 Zend Framework 控制器
【发布时间】:2013-11-26 06:36:53
【问题描述】:

在 Zend Framework (v1.12) 应用程序中,我想强制调用特定的控制器 (api)。

我已经设法重写了任何请求,因此无论请求是什么(例如http://example.com/foo/bar”或“http://example.com”),它都会被重写为http://example.com/api/...( 例如。 "http://example.com/api/foo/bar" 或 "http://example.com/api/") 具有以下 Apache 重写规则:

<VirtualHost *:80>
    [...]
    RewriteEngine On
    RewriteCond %{REQUEST_URI} !^/?api/?.* [NC]
    RewriteCond %{REQUEST_URI} !^/index\.php$ [NC]
    RewriteRule ^/?(.*)$ /api/$1 [R,L]
    [...]
</VirtualHost>

RewriteLogs 说:

/initial] (2) init rewrite engine with requested uri /api/
/initial] (3) applying pattern '^/?(.*)$' to uri '/api/'
/initial] (1) pass through /api/
/initial] (3) [perdir /var/www/example.com/public/] add path info postfix: /var/www/example.com/public/api -> /var/www/example.com/public/api/
/initial] (3) [perdir /var/www/example.com/public/] strip per-dir prefix: /var/www/example.com/public/api/ -> api/
/initial] (3) [perdir /var/www/example.com/public/] applying pattern '^.*$' to uri 'api/'
/initial] (3) [perdir /var/www/example.com/public/] add path info postfix: /var/www/example.com/public/api -> /var/www/example.com/public/api/
/initial] (3) [perdir /var/www/example.com/public/] strip per-dir prefix: /var/www/example.com/public/api/ -> api/
/initial] (3) [perdir /var/www/example.com/public/] applying pattern '^.*$' to uri 'api/'
/initial] (2) [perdir /var/www/example.com/public/] rewrite 'api/' -> 'index.php'
/initial] (3) [perdir /var/www/example.com/public/] add per-dir prefix: index.php -> /var/www/example.com/public/index.php
/initial] (2) [perdir /var/www/example.com/public/] strip document_root prefix: /var/www/example.com/public/index.php -> /index.php
/initial] (1) [perdir /var/www/example.com/public/] internal redirect with /index.php [INTERNAL REDIRECT]
/initial/redir#1] (2) init rewrite engine with requested uri /index.php
/initial/redir#1] (3) applying pattern '^/?(.*)$' to uri '/index.php'
/initial/redir#1] (1) pass through /index.php

但这仍然允许用户通过http://example.com/index.php访问应用程序的主页,我无法禁止这样做。

我试图阻止:

<VirtualHost *:80>
    [...]
    # Rewrite code from above
    [...]
    <Location /index.php>
        Order Allow,Deny
        Deny from all
    </Location>
    [...]
</VirtualHost>

但是作为一个 ZF 应用程序,每个请求都必须传递给 index.php(引导程序):标准的 ZF 重写规则将所有内容都重写到 index.php:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ index.php [NC,L]

因此我得到“禁止 - 您无权访问此服务器上的 /index.php”。每个请求。

用于重写请求时是否允许访问“index.php”并禁止直接访问?

我确信这可以由 ZF 应用程序的路由器完成,但希望避免更改应用程序的 PHP 源代码。

【问题讨论】:

    标签: zend-framework mod-rewrite


    【解决方案1】:

    使用ENV:REDIRECT_STATUS 变量(参见mromainecontribution"Hidden features of mod_rewrite" community wiki 我已经设法禁止直接访问index.php

    RewriteEngine On
    
    # Force controller "api"
    RewriteCond %{REQUEST_URI} !^/?api/?.* [NC]
    RewriteCond %{REQUEST_URI} !^/index\.php$ [NC]
    RewriteRule ^/?(.*)$ /api/$1 [R,L]
    
    # Deny direct access to "index.php"
    RewriteCond %{ENV:REDIRECT_STATUS} ^$
    RewriteRule index\.php$ - [NC,F]
    

    测试用例:

    【讨论】:

      猜你喜欢
      • 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
      相关资源
      最近更新 更多