我已经在example.com中安装了WordPress。我还在ci
文件夹中的example.com/ci/
中安装了CodeIgniter,其中ci
是文件夹名称,register
是控制器名称,CI的工作URL是example.com/ci/register
。我的基本URL以https://开头。
现在我有一个WordPress URL example.com/hotel
,hotel
是我在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/