网址重写(URL Rewriting)

    这里有一些办法你可以尝试,来让它正确地运行。首先,查看 httpd.conf。(确保你是在修改系统级的 httpd.conf,而不是用户级或者站点级的 httpd.conf。)

    这些文件随(Linux)发行版本的不同和 Apache 版本的不同而有所变化。你也可以查看http://wiki.apache.org/httpd/DistrosDefaultLayout 以获取更多的信息。

    • 确保允许 .htaccess 优先(override),并且正确的 DocumentRoot 的 AllowOverride设置为 All。你应当看到类似于:

    对于 apache 2.4 及更高版本的用户,你需要象下面这样修改 的配置文件或者 虚拟主机(Virtual Host)的配置:

    1. <Directory /var/www/>
    2. Options FollowSymLinks
    3. AllowOverride All
    4. Require all granted
    5. </Directory>
    • 确保正确加载了 mod_rewrite。你应当看到类似于:
    1. LoadModule rewrite_module libexec/apache2/mod_rewrite.so

    在很多系统中缺省情况下这是被注释掉的,这样你就只需去掉开头的#符号。

    做完修改后,重启 Apache,确保设置起作用。

    核实你的 .htaccess 文件的确在正确的目录中。某些操作系统认为以'.'开头的文件是隐藏的,因此不会拷贝这些文件。

    • 确保你的 CakePHP 拷贝来自官网的下载部分或者我们的 Git 库,并且查看各个.htaccess 文件以确保解压正确。

    CakePHP 根目录(需要拷贝到你的文档目录; 会把所有的输入转向到你的 CakePHP 应用程序):

    1. <IfModule mod_rewrite.c>
    2. RewriteEngine on
    3. RewriteRule ^$ app/webroot/ [L]
    4. RewriteRule (.*) app/webroot/$1 [L]
    5. </IfModule>
    1. <IfModule mod_rewrite.c>
    2. RewriteEngine on
    3. RewriteRule ^$ webroot/ [L]
    4. RewriteRule (.*) webroot/$1 [L]
    5. </IfModule>

    CakePHP 的 webroot 目录(bake 会把它拷贝到你的应用程序的 webroot 目录):

    如果你的 CakePHP 网站仍然有 mod_rewrite 的问题,你也许可以尝试修改虚拟主机的设置。在 Ubuntu 系统中,编辑文件 /etc/apache2/sites-available/default (其位置取决于发行版本)。在该文件中,确保 改为 ,所以就是:

    1. <Directory />
    2. Options FollowSymLinks
    3. AllowOverride All
    4. </Directory>
    5. <Directory /var/www>
    6. Options Indexes FollowSymLinks MultiViews
    7. AllowOverride All
    8. Order Allow,Deny
    9. </Directory>

    在 Mac OSX 中,另一个方法是使用 工具来创建一个虚拟主机,指向你的目录。

    对于很多托管服务(GoDaddy, 1and1),你的 web 服务器实际上是从一个已经使用mod_rewrite 的用户目录提供的。如果你把 CakePHP 安装到一个用户目录(http://example.com/~username/cakephp/),或者任何已经使用 mod_rewrite 的网址结构,你需要在 CakePHP 使用的 .htaccess 文件(/.htaccess、/app/.htaccess、/app/webroot/.htaccess)中添加 RewriteBase 语句。

    这可以加在 RewriteEngine 指令所在的同一个小节中,例如,你的 webroot 的.htaccess 文件可以象这样:

    1. <IfModule mod_rewrite.c>
    2. RewriteEngine On
    3. RewriteBase /path/to/cake/app
    4. RewriteCond %{REQUEST_FILENAME} !-d
    5. RewriteCond %{REQUEST_FILENAME} !-f
    6. RewriteRule ^(.*)$ index.php [QSA,L]
    7. </IfModule>

    这些改动的细节取决于你的设置,而且可能包含与 CakePHP 无关的其它东西。更多信息请参考 Apache 的在线文档。

    • (可选) 要改善生产环境的设置,你应当让 CakePHP 避免解析非法的资源。可以把webroot 的 .htaccess 文件修改成象下面这样:
    1. <IfModule mod_rewrite.c>
    2. RewriteEngine On
    3. RewriteBase /path/to/cake/app
    4. RewriteCond %{REQUEST_FILENAME} !-d
    5. RewriteCond %{REQUEST_FILENAME} !-f
    6. RewriteCond %{REQUEST_URI} !^/(app/webroot/)?(img|css|js)/(.*)$
    7. RewriteRule ^(.*)$ index.php [QSA,L]
    8. </IfModule>

    上面的设置就会简单地避免错误的资源被送往 index.php,而显示你的 web 服务器的404页面。

    1. ErrorDocument 404 /404-not-found

    nginx 的友好网址

    nginx 不像 Apache 那样使用 .htaccess 文件,所以必须在站点的配置中创建这些重写网址。根据你的设置,你要修改这个(配置),不过至少你要让 PHP 作为 FastCGI 实例来运行。

    如果因为某种奇怪的原因,你不能改变你的根目录,而需要从一个象example.com/subfolder/这样的子目录来运行你的项目,你就不得不在每个请求中加入"/webroot"。

    1. location ~ ^/(subfolder)/(.*)? {
    2. index index.php;
    3.  
    4. set $new_uri /$1/webroot/$2;
    5. try_files $new_uri $new_uri/ /$1/index.php?$args;
    6.  
    7. ... php handling ...
    8. }

    注解

    较新的 PHP-FPM 配置设置为监听 php-fpm 套接字(socket),而不是 127.0.0.1地址的 9000 TCP 端口。如果你使用上面的配置,遇到 502 bad gateway 的错误,尝试把 fastcgi_pass 从 TCP 端口改为套接字路径(例如:fastcgi_pass unix:/var/run/php5-fpm.sock;)。

    IIS7 本身不支持 .htaccess 文件。虽然有插件(add-on)可增加这种支持,但是也可以把htaccess 规则导入 IIS,来使用 CakePHP 的原生重写。为此,按照如下步骤进行:

    • 使用 Microsoft 的 Web Platform Installer来安装网址 或者直接下载(32位/ )。
    • 在 CakePHP 根目录创建一个文件 web.config。
    • 使用记事本(Notepad)或任何对 XML 安全的编辑器,拷贝下面的代码到新建的web.config 文件中……
    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <configuration>
    3. <system.webServer>
    4. <rewrite>
    5. <rule name="Rewrite requests to test.php"
    6. stopProcessing="true">
    7. <match url="^test.php(.*)$" ignoreCase="false" />
    8. <action type="Rewrite" url="app/webroot/test.php{R:1}" />
    9. </rule>
    10. <rule name="Exclude direct access to app/webroot/*"
    11. stopProcessing="true">
    12. <match url="^app/webroot/(.*)$" ignoreCase="false" />
    13. <action type="None" />
    14. </rule>
    15. <rule name="Rewrite routed access to assets(img, css, files, js, favicon)"
    16. stopProcessing="true">
    17. <match url="^(img|css|files|js|favicon.ico)(.*)$" />
    18. <action type="Rewrite" url="app/webroot/{R:1}{R:2}"
    19. appendQueryString="false" />
    20. </rule>
    21. <rule name="Rewrite requested file/folder to index.php"
    22. stopProcessing="true">
    23. <match url="^(.*)$" ignoreCase="false" />
    24. <action type="Rewrite" url="index.php"
    25. appendQueryString="true" />
    26. </rule>
    27. </rules>
    28. </rewrite>
    29. </system.webServer>
    30. </configuration>

    一旦创建了含有正确的 IIS 方式的重写规则的 web.config 文件,CakePHP 的链接、CSS、JavaScript和路由就应该可以正常工作了。

    lighttpd 的网址重写

    Lighttpd 不支持 .htaccess 功能,故而可以删除所有 .htaccess 文件。在 lighttpd 的配置中,确保启用了 "mod_rewrite"。增加一行:

    1. url.rewrite-if-not-file =(
    2. "^([^\?]*)(\?(.+))?$" => "/index.php?url=$1&$3"
    3. )
    1. UrlToolkit {
    2. ToolkitID = cakephp
    3. RequestURI exists Return
    4. Match .* Rewrite /index.php

    我不/无法使用网址重写

    如果在你的 web 服务器上不想或者不能使用网址重写,请参考核心配置