我已在 example.com 中安装了 WordPress。我还在ci
文件夹中安装了CodeIgniter,这里example.com/ci/
,ci
是文件夹名称,register
是 Controller 名称,CI 的工作 URL 是 example.com/ci/register
。我的基本 URL 以 https://开头。
现在我有一个 WordPress 网址 example.com/hotel
,hotel
是我在 WordPress 管理中心创建的页面,它工作正常。
我想运行我的 CI 路径,如 example.com/hotel/ci/register
,我想我们可以使用一些重写规则来实现,这样我的 URL 就会像 example. com/hotel/ci/register
。我已经为 WordPress 添加了给定的 htaccess
,它将我重定向到这里 example.com/hotel/ci/register
。它向我展示了 CI 的 404 错误
。这意味着我现在在CI。现在我在 routes.php
文件中做了以下事情。
$route['default_controller'] = 'register';
$route['404_override'] = 'register';
现在这个 URL example.com/hotel/ci/register
可以工作,但这不是正确的方法,下次会有更多 Controller 时它就不起作用了。
注意:我无法创建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>
最佳答案
有趣的问题!我设置了一个 Docker 容器,全新安装了 Wordpress 和 Codeigniter,我创建了一个 hotel
WP 中的页面,以及 Register
CI 中的 Controller 和 View ,并进行了测试。我在这个问题上花了太长时间,但我确实找到了答案。
首先,你的 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 不会更改),Codeigniter 接收到处理的 URI 仍然显示在浏览器地址栏中 - hotel/ci/register
。 Codeigniter 将尝试通过两种方式处理此类请求:
在
application/config/routes.php
中查找匹配的路线或者查找名为
application/controllers/Hotel.php
的 Controller ,使用名为ci
的方法;
在我们的例子中没有 Hotel
Controller ,并且没有路由来描述如何处理此类请求,所以繁荣,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
条件将失败,跳过重定向,请求成功。我不确定你的
resources
部分,但也许您可以完全消除该情况。如果你不需要漂亮的 Codeigniter URL(我的意思是除
https://example.com/hotel/ci/register
之外,此更改不会影响它),并且事实证明你不需要上面的额外条件,你可以得到摆脱 CI.htaccess
完全是为了简化事情。为此,只需更改 WordPressRewriteRule
到不漂亮的版本:RewriteRule ^hotel/ci/register /ci/index.php/register [L]
并删除您的 CI
.htacces
。
关于htaccess 中的 WordPress 和 CI 重写规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46787656/