子目录中的Zend应用程序使Zend布局链接正常工作

时间:2012-03-21 17:32:25

标签: php zend-framework .htaccess

我在子目录中设置了Zend应用程序。不要问为什么我只是这样做(不是我喜欢的方法),但我没有那个选择。 Zend应用程序驻留在一个名为dsa的子目录中。

http://dsa.dev/dsa

我的.htaccess

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^(.*)$ public/index.php [QSA,L] 

这可以并且将引导应用程序。我可以毫无问题地进入我的根目录和其他目录。

在我的application.ini中,我已经设置了

resources.frontController.baseUrl = "/dsa".  

在我的layout.phtml文件中,如果我var_dump它看起来像这样的路径。

var_dump($this->baseUrl('css/main.css'));
http://dsa.dev/dsa/css/main.css

没有链接有效,所有css和js文件都没有正确链接。如果您按F12并查看它们,则会找不到任何文件的404。要获取显示文件的正确路径,我需要做什么。这是我第一次尝试在子目录中设置zend,显然我做的不对。我已经阅读了关于这个主题的所有内容。谢谢你的帮助。

2 个答案:

答案 0 :(得分:6)

我看到的至少一个问题是.htaccess文件中的重写规则不正确。

鉴于这些规则:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^(.*)$ public/index.php [QSA,L]

这些规则等同于:

RewriteCond %{REQUEST_FILENAME} -s [OR]#该请求是一个大小为>的常规文件0 RewriteCond %{REQUEST_FILENAME} -l [OR]#请求是一个符号链接的文件 RewriteCond %{REQUEST_FILENAME} -d [OR]#请求是存在的目录

如果以上任何一种情况属实,请求将被重写为public/index.php,这是不正确的。如果请求是针对磁盘上存在的文件,则不要重写它;相反,你只想提供该文件。

正确的.htaccess文件应如下所示:

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

这就是说,如果请求是针对大小为>的文件0,目录或符号链接,然后将请求路由到请求的实际文件(RewriteRule ^.*$ -)。如果这些条件都不成立,则将请求重写为index.php。

另外,我会继续完全摆脱public目录。获取public的内容并将其放入/dsadsa现在是您的public文件夹。您可以将application目录存储在系统的任何位置,或者由于文件系统限制而必须将其放在dsa文件夹中,请确保在.htaccess文件中添加规则,拒绝对application文件夹的所有访问权限。然后,您只需要快速更改index.php文件,告诉它使用application常量APPLICATION_PATH的正确路径。

我相信这两项改变应该可以解决你的问题。

答案 1 :(得分:0)

尝试在.htaccess中设置RewriteBase /dsa