我已经在example.com中安装了WordPress。我还在ci文件夹中的example.com/ci/中安装了CodeIgniter,其中ci是文件夹名称,register是控制器名称,CI的工作URL是example.com/ci/register。我的基本URL以https://开头。

现在我有一个WordPress URL example.com/hotelhotel是我在WordPress管理中创建的页面,它可以正常工作。

我想像example.com/hotel/ci/register那样运行CI路径,我想我们可以使用一些重写规则来做到这一点,以便我的URL看起来像example.com/hotel/ci/register。我已为wordpress添加了给定的htaccess,可将我重定向到example.com/hotel/ci/register。向我显示CI的404 error。这意味着我现在在CI中。现在,我在routes.php文件中做了以下操作。

$route['default_controller'] = 'register';
$route['404_override'] = 'register';


现在,此URL example.com/hotel/ci/register正在工作,但这不是正确的方法,下一次将有更多的控制器,然后它将无法工作。

注意:我无法创建hotel文件夹,因为hotel是WordPress中的页面。如果我创建hotel文件夹,则WordPress URL example.com/hotel/将不起作用。它将WordPress页面重定向到hotel文件夹。所以我必须不创建hotel文件夹。注意example.com = myurl.com。

我需要找到另一个好的解决方案。任何建议或指导将不胜感激?

以下是我在wordpress htaccess中的重写规则:

# BEGIN WordPress
   <IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    RewriteRule ^/?hotel/ci/register(/.*)?$ /ci/$1 [L]
    RewriteRule ^index\.php$ - [L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /index.php [L]
    </IfModule>
# END WordPress


以下是我的CI htaccess

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond $1 !^(index\.php|resources|robots\.txt)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?/$1 [L,QSA]
</IfModule>

最佳答案

有趣的问题!我用全新安装的Wordpress和Codeigniter设置了一个Docker容器,在WP中创建了hotel页面,并在CI中创建了Register控制器和视图,并进行了测试。我花了太长时间,但是我确实找到了答案。

首先,您的Wordpress .htaccess。正如@tobiv在注释中指出的那样,您不应在BEGIN/END WordPress注释之间添加任何内容,因为它可能会因WP更新而受到破坏。但是,您的重定向必须在标准WP规则之前,因此请将其添加到文件的顶部:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^hotel/ci/register /ci/register [L]
</IfModule>

# BEGIN WordPress
# ... These are the default, unchnaged WP rules
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>


<IfModule mod_rewrite.c>RewriteEngine On是重复的,看起来很杂乱,但是您确实需要它们,因为新规则必须首先执行,以便它在WP规则之前处理请求。

您不需要修改Codeigniter .htaccess文件,默认文件就是您所需要的。它应位于您的Codeigniter安装目录的根目录ci/.htaccess中:

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


此时,https://example.com/hotel/ci/register将显示Codeigniter 404页面。如果启用了日志记录(请参见config/config.php),并且观看了日志文件,则会看到原因:

ERROR - 2017-11-14 17:57:20 --> 404 Page Not Found: Hotel/ci


这是整个问题的根源。由于初始重定向是内部重定向(意味着浏览器中显示的URL不变),因此URI Codeigniter接收到的仍是浏览器地址栏中显示的URL-hotel/ci/register。 Codeigniter将尝试通过两种方式处理此类请求:


application/config/routes.php中查找匹配的路由
或使用名为application/controllers/Hotel.php的方法寻找名为ci的控制器;


在我们的案例中,没有Hotel控制器,也没有描述如何处理此类请求的路线,所以请转为404。

一个简单的解决方案是创建一条路由来处理此请求:

$route['hotel/ci/register'] = 'register/index';


现在https://example.com/hotel/ci/register起作用了!

笔记:


将默认路由设置为register$route['default_controller'] = 'register';)意味着https://example.com/ci/也将显示注册。我不确定你是否想要那?如果该URL显示与https://example.com/hotel/ci/register相同的内容,则可能会遇到重复内容SEO问题,因此,您可能需要在其中输入其他内容或404。
确保删除$route['404_override'] = 'register';路线;
尽管显然应该设置CI base_url与该问题无关。根据您希望链接的方式,我认为http://example.com/ci/http://example.com/hotel/ci/都是正确的。
我不确定您的CI .htaccess中此条件的目的是什么:

RewriteCond $1 !^(index\.php|resources|robots\.txt)


现有的默认条件已经跳过了磁盘上存在的文件和目录。这就是!-f!-d条件的含义-“如果请求的模式与磁盘上的文件或目录不匹配,则进行重定向”。

如果磁盘上有一个robots.txt文件(在您的ci/目录中),并且有人请求https://example.com/ci/robots.txt,则!-f条件将失败,并且重写将被跳过-这意味着该请求将被处理而无需重写和返回成功。与robots.txt相同。如果您有一个名为index.php的目录,并且有人请求ci/resources,则https://example.com/ci/resources条件将失败,重定向将被跳过,并且请求成功。

我不确定您的!-d部分,但也许您可以完全删除该条件。
如果您不需要漂亮的Codeigniter URL(我的意思是除resources之外,此更改将不会影响它),事实证明您不需要上述额外条件,则可以删除CI 完全简化事情。为此,只需将Wordpress https://example.com/hotel/ci/register更改为非漂亮版本:

RewriteRule ^hotel/ci/register /ci/index.php/register [L]


并删除您的CI .htaccess

关于wordpress - htaccess中的Wordpress和CI重写规则,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46787656/

10-16 16:25
查看更多