CakePHP伪静态规则设置(网址重写代码)

Apache 和 mod_rewrite (以及 .htaccess)
虽然 CakePHP 编写的就是要自动和 mod_rewrite 一起使用——而且通常可以——但是我们 的确注意到一些用户在他们的系统中很难使所有东西在一起顺利地运行。

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

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

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

# Apache 可以访问的每个目录可以设置该目录(及其子目录)允许及/或不允许何种服
# 务和特性。
#
# 首先,我们配置 "default" 为很有限的一组特性。
#
<Directory />
    Options FollowSymLinks
    AllowOverride All
#    Order deny,allow
#    Deny from all
</Directory>

确保正确加载了 mod_rewrite。你应当看到类似于:

LoadModule rewrite_module libexec/apache2/mod_rewrite.so


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

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

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

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

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

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

CakePHP app 目录(bake 会把它拷贝到你的应用程序的最高一级目录):

<IfModule mod_rewrite.c>
   RewriteEngine on
   RewriteRule    ^$    webroot/    [L]
   RewriteRule    (.*) webroot/$1    [L]
</IfModule>
CakePHP 的 webroot 目录(bake 会把它拷贝到你的应用程序的 webroot 目录):

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

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

<Directory />
    Options FollowSymLinks
    AllowOverride All
</Directory>
<Directory /var/www>
    Options Indexes FollowSymLinks MultiViews
    AllowOverride All
    Order Allow,Deny
    Allow from all
</Directory>

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


对于很多托管服务(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 文件可以象这样:

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

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

(可选) 要改善生产环境的设置,你应当让 CakePHP 避免解析非法的资源。可以把 webroot 的 .htaccess 文件修改成象下面这样:

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /path/to/cake/app
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_URI} !^/(app/webroot/)?(img|css|js)/(.*)$
    RewriteRule ^(.*)$ index.php [QSA,L]
</IfModule>
上面的设置就会简单地避免错误的资源被送往 index.php,而显示你的 web 服务器的 404页面。

另外,你可以创建一个匹配的 HTML 404 页面,或者添加 ErrorDocument 指令来使 用 CakePHP 内置的 404 页面:

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

server {
    listen   80;
    server_name www.example.com;
    rewrite ^(.*) http://example.com$1 permanent;
}

server {
    listen   80;
    server_name example.com;

    # root directive should be global
    root   /var/www/example.com/public/app/webroot/;
    index  index.php;

    access_log /var/www/example.com/log/access.log;
    error_log /var/www/example.com/log/error.log;

    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    location ~ \.php$ {
        try_files $uri =404;
        include /etc/nginx/fastcgi_params;
        fastcgi_pass    127.0.0.1:9000;
        fastcgi_index   index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
}

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

location ~ ^/(subfolder)/(.*)? {
   index  index.php;

   set $new_uri /$1/webroot/$2;
   try_files $new_uri $new_uri/ /$1/index.php?$args;

   ... php handling ...
}

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


使用 Microsoft 的 Web Platform Installer 来安装网址 重写模块 2.0 或者直接下载(32位 / 64位)。
在 CakePHP 根目录创建一个文件 web.config。
使用记事本(Notepad)或任何对 XML 安全的编辑器,拷贝下面的代码到新建的 web.config 文件中……

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <rewrite>
            <rules>
                <rule name="Rewrite requests to test.php"
                  stopProcessing="true">
                    <match url="^test.php(.*)$" ignoreCase="false" />
                    <action type="Rewrite" url="app/webroot/test.php{R:1}" />
                </rule>
                <rule name="Exclude direct access to app/webroot/*"
                  stopProcessing="true">
                    <match url="^app/webroot/(.*)$" ignoreCase="false" />
                    <action type="None" />
                </rule>
                <rule name="Rewrite routed access to assets(img, css, files, js, favicon)"
                  stopProcessing="true">
                    <match url="^(img|css|files|js|favicon.ico)(.*)$" />
                    <action type="Rewrite" url="app/webroot/{R:1}{R:2}"
                      appendQueryString="false" />
                </rule>
                <rule name="Rewrite requested file/folder to index.php"
                  stopProcessing="true">
                    <match url="^(.*)$" ignoreCase="false" />
                    <action type="Rewrite" url="index.php"
                      appendQueryString="true" />
                </rule>
            </rules>
        </rewrite>
    </system.webServer>
</configuration>


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值