3

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

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

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

  1. 这是最好的方法吗?如果是这样的话:
  2. 这种规则的正确语法是什么?
  3. 那个文件应该去哪里?域根?在 cake_dir 中?还是在蛋糕的根目录中?
  4. 如果 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 在 /_cake...

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

.htaccess 在 /_cake/app...

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

/_cake/app/webroot 中的.htaccess ...

<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>
4

2 回答 2

3

$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]
于 2013-04-09T15:30:08.797 回答
1

如果您想这样做,当有人请求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]
于 2013-04-08T00:28:01.203 回答