htaccess 中的 WordPress 和 CI 重写规则

标签 wordpress .htaccess codeigniter

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

现在我有一个 WordPress 网址 example.com/hotelhotel 是我在 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完全是为了简化事情。为此,只需更改 WordPress RewriteRule到不漂亮的版本:

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

    并删除您的 CI .htacces

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

相关文章:

.htaccess - 将 .php URL 重定向到不带扩展名的 URL

apache - Codeigniter 网站上的链接在新服务器上损坏

php - 带数组的 Codeigniter where 子句

apache - 使用 mod_rewrite 和 vhost_alias 进行无限循环

apache - 使用 .htaccess [#Q1.] 修改 URL

wordpress - 通过代码 Wordpress 切换主题

categories - 从自定义帖子类型循环/存档中排除类别

javascript - Codeigniter 和 AJAX - 关闭编辑模式时重置/清除模式表单

php - 在 WooCommerce 中更改虚拟、可下载、免费或缺货产品的订单状态

mysql - wp super cache导致数据库崩溃