如何使子目录中的 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)? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章