如何使子目录中的 cakePHP 2.x 出现在根目录中(在 htaccess 中使用 mod_rewrite)? [关闭]

Posted

技术标签:

【中文标题】如何使子目录中的 cakePHP 2.x 出现在根目录中(在 htaccess 中使用 mod_rewrite)? [关闭]【英文标题】:How to make cakePHP 2.x in sub directory appear in root (with mod_rewrite in htaccess)? [closed] 【发布时间】:2013-03-29 22:52:12 【问题描述】:

我正在开发一个位于子目录内的蛋糕应用程序(因为我需要在同一个域中的另一个应用程序旁边运行它)。我希望由 cake 提供支持的页面看起来好像它们是***的。

所以我想要example.com/page...而不是example.com/cake_dir/page...

我认为完成这项工作的最佳方法是向 .htaccess 文件添加重写规则,所以这是我想知道的:

    这是最好的方法吗? 如果是这样: 这种规则的正确语法是什么? 该文件应该放在哪里?域根?在 cake_dir 中?还是在 cake 的 webroot 中? 如果 Cake 的 .htaccess 文件之一已经存在于该位置,那么新规则应该放在之前还是之后,并且应该删除 [L]s 中的一个?

更新:更清晰地描述我正在尝试做的事情

example.com/ <--root
    /_cake   <--Cakephp installed here
        /page3
        /page4

目前,访问者必须通过 example.com/_cake/page3 访问第 3 页。这很糟糕。相反,我想要这个:example.com/page3,如果 cake 路由到 example.com/_cake/page4,我希望它在浏览器中显示为 example.com/page4。

我一直在尽可能多地积累 mod_rewrite 知识,我认为做到这一点的方法是在 _cake 不存在时进行内部重写以显示正确的内容,并在 _cake 存在时进行外部重写。

更新 这是现有的 .htaccess 文件...

.htaccess in /_cake...

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

.htaccess in /_cake/app...

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

.htaccess 在 /_cake/app/webroot...

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

更新 2 我将 anubhava 的代码添加到根 .htaccess 文件中,然后还更新了 /_cake/ 处的 .htaccess 文件,如下所示(请注意,我必须删除 [L] 以使 CakePHP 的正常重写仍然有效) :

# Turn mod_rewrite on
RewriteEngine On
RewriteBase /

# external redirect from /_cake/page to /page
RewriteCond %THE_REQUEST ^[A-Z]3,\s/+_cake/([^\s]+) [NC]
RewriteRule ^ /%1 [R=302]

# internal forward from /page to /_cake/page
RewriteCond %REQUEST_FILENAME !-f
RewriteCond %REQUEST_FILENAME !-d
RewriteRule (?!^_cake/)^(.*)$ /_cake/$1 [NC]


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

【问题讨论】:

【参考方案1】:

$DOCUMENT_ROOT/.htaccess:

Options +FollowSymLinks -MultiViews
# Turn mod_rewrite on
RewriteEngine On
RewriteBase /

# internal forward from /page to /_cake/page
RewriteCond %REQUEST_FILENAME !-f
RewriteRule (?!^_cake/)^(.*)$ /_cake/$1 [L,NC]

$DOCUMENT_ROOT/_cake/.htaccess:

RewriteEngine on
RewriteBase /_cake/
RewriteRule (.*) app/webroot/$1 [L]

$DOCUMENT_ROOT/_cake/app/.htaccess:

RewriteEngine on
RewriteBase /_cake/app/
RewriteRule (.*) webroot/$1 [L]

$DOCUMENT_ROOT/_cake/app/webroot/.htaccess:

RewriteEngine On
RewriteBase /_cake/app/webroot/

RewriteCond %THE_REQUEST ^[A-Z]3,\s/+_cake/([^\s&]*) [NC]
RewriteRule ^ /%1 [R=302,L]

RewriteCond %REQUEST_FILENAME !-d
RewriteCond %REQUEST_FILENAME !-f
RewriteRule ^ index.php [L]

【讨论】:

谢谢,但我仍然在 URL 中看到 _cake。它应该被删除吗? 是的。 Cake 在 _cake 和 _cake/app/webroot 中放置了一个 .htacces 文件。那些申请是因为外部重写指向同一个域吗? 我要将每个 .htaccess 文件添加到问题中... 你的意思是重命名目录吗?或者更改代码中的 _cake? 我用您的代码进行了搜索/替换,它确实将包含 /_sample/page 的 url 更改为 /page。这是否意味着 CakePHP 的 .htaccess 搞砸了?【参考方案2】:

如果您想这样做,当有人请求http://example.com/page 时,他们实际上得到了/cake_dir/page 提供的内容,那么您应该将这些规则添加到文档根目录(或“域根目录”)中的 htaccess 文件中:

RewriteEngine On
RewriteCond %DOCUMENT_ROOT/cake_dir%REQUEST_URI -f
RewriteRule ^(.*)$ /cake_dir/$1 [L]

浏览器地址栏中的 URL 将保持不变,因为没有外部重定向。这里的条件是它检查%DOCUMENT_ROOT/cake_dir%REQUEST_URI 是否指向一个文件。该字符串本质上是将文档根目录、字符串“cake_dir”和实际请求的文件放在一起。如果这些请求都没有实际指向“cake_dir”中的物理文件,您可以尝试:

RewriteEngine On
RewriteCond %REQUEST_FILENAME !-f
RewriteCond %REQUEST_FILENAME !-d
RewriteRule ^(.*)$ /cake_dir/$1 [L]

这里的条件是请求的 URI(例如/page)确实指向现有文件或目录。它会盲目地将所有内容路由到/cake_dir 目录中。


如果有人点击其中包含 cake_dir 的链接,重定向浏览器,那么您需要以下规则:

RewriteCond %THE_REQUEST ^(GET|HEAD)\ /cake_dir/
RewriteRule ^cake_dir/(.*)$ /$1 [L,R=301]

【讨论】:

是的!!!!添加第二个代码块后它起作用了。我目前两者都有。那是对的吗?另外,有没有办法让蛋糕中的链接不会将 /cake_dir/ 添加回 url?也许是重定向? @Emerson 你只需要一个或另一个,它只取决于你想要什么类型的条件,请求的 URI 是否实际存在于 cake_dir (第一个)或请求是否不匹配物理文件或目录(第二个)。 最后一点不太明白。可以这样做以使 cake_dir 永远不会出现(即使在原始目录中? 我快要让它工作了,但还不是很正确。我希望 example.com/cakepage 显示来自 example.com/cake_dir/cakepage 的内容以及到 example.com/cake_dir/page 的所有流量都显示为 example.com/page。我认为后者需要“外部”重写,但我似乎无法让它工作。 我用更清晰的描述更新了问题。

以上是关于如何使子目录中的 cakePHP 2.x 出现在根目录中(在 htaccess 中使用 mod_rewrite)? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

在 CakePHP 2.x 中使变量可用于所有控制器

在 cakephp 2.x 中如何使用连接表获取第三个表数据?

CakePHP:删除行后如何使自动增量值再次连续

NextJS:如何在根处理多个动态路由

导航栏上的 iOS::Button 仅出现在根视图控制器上

在 CakePHP 2.x ORM + 中使用函数 MySQL 和 NameClass 模型删除 ;(