gpt4 book ai didi

php - 从 CodeIgniter 中删除并重定向 index.php

转载 作者:行者123 更新时间:2023-12-01 19:56:32 25 4
gpt4 key购买 nike

我有一个旧项目,它有一些奇怪的问题。其 CodeIgniter 项目(版本 2.X)。

Google 正在使用 index.php 为我们的 URL 建立索引?下面是一个例子

https://www.website.com/index.php?/my-seo-friendly-uri

我可以从上面的网址查看我的页面,并有以下 2 个变体

https://www.website.com/index.php/my-seo-friendly-uri

https://www.website.com/my-seo-friendly-uri

我们在整个网站中使用了 https://www.website.com/my-seo-Friendly-uri

我的问题是如何重定向https://www.website.com/index.php?/my-seo-Friendly-urihttps://www.website .com/index.php/my-seo-friend-urihttps://www.website.com/my-seo-friend-uri

我已经做过的事情

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^index.php/(.*)$ /$1 [R=302,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?/$1 [L]
</IfModule>

这会将 index.php 重定向到正常 URL,但 index.php? 版本的 url 仍未重定向

在我的 config.php 中,我有以下设置

$config['index_page'] = '';
$config['uri_protocol'] = 'REQUEST_URI';

最佳答案

https://www.example.com/index.php?/my-seo-friendly-uri

此 URL 包含查询字符串,因此需要稍微不同的规则才能匹配它。 RewriteRule 模式仅与 URL 路径匹配(在本例中仅匹配 index.php)。查询字符串在其自己的变量中可用。

在现有指令之前添加以下内容(除了与 /index.php/my-seo-friendly-url 匹配的指令 - 作为路径信息传递):

# Redirect URLs of the form "/index.php?/my-seo-friendly-uri"
# And "/?/my-seo-friendly-uri"
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{QUERY_STRING} ^(/.*)
RewriteRule ^(index\.php)?$ %1 [QSD,R=302,L]

捕获查询字符串(第二个条件),并使用反向引用 ( %1 ) 来构造重定向。

第一个条件检查 REDIRECT_STATUS为了防止重定向循环,需要环境变量,因为您似乎在稍后的重写中使用查询字符串方法来路由 codeigniter URL。 REDIRECT_STATUS env var 在初始请求时为空,但在第一次成功重写后设置为“200”(如 200 OK HTTP 状态)。

QSD需要使用 flag (Apache 2.4+) 来丢弃重定向请求中的原始查询字符串。如果您仍在使用 Apache 2.2,则附加 ? (空查询字符串)替换为替换字符串。 IE。 %1?

通过匹配 index.php 可选(即 ^(index\.php)?$ )它还将规范化省略 index.php 的 URL ,但仍然包含查询字符串(当前可能是问题,也可能不是问题)。例如。 /?/my-seo-friendly-uri .

请注意,这当前是 302(临时)重定向(与您现有的重定向相同)。仅在确认其正常工作后才将其更改为 301(永久)重定向。 301 由浏览器持久缓存,因此可能会给测试带来问题。

摘要

您的.htaccess文件应如下所示:

RewriteEngine On

# Query string...
# Redirect URLs of the form "/index.php?/my-seo-friendly-uri"
# And "/?/my-seo-friendly-uri"
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{QUERY_STRING} ^(/.*)
RewriteRule ^(index\.php)?$ %1 [QSD,R=302,L]

# Path-Info...
# Redirect URLs of the form "/index.php/my-seo-friendly-uri"
# Also handles "/index.php" only
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^index.php(?:/(.*))?$ /$1 [R=302,L]

# CodeIgniter Front-controller
# (NB: Using query string method to pass the URL)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*) index.php?/$1 [L]

附加说明...

  • <IfModule>不需要包装。
  • (.*)^(.*)$ 相同因为正则表达式默认是贪婪的。
  • 我已经修改了您现有的路径信息重定向(即 /index.php/foo ),以也重定向对 /index.php 的请求。仅有的。现在需要一个附加条件来避免重定向循环。
  • 您的 CodeIgniter 前端 Controller 正在使用查询字符串方法来传递 /my-seo-friendly-url到后端(如问题中所使用)。但是,您已设置 $config['uri_protocol'] = 'REQUEST_URI'; - 这与此相矛盾(尽管不一定是问题)。但是,如果您使用 REQUEST_URI方法然后你可以删除 ?/$1决赛结束部分RewriteRule 替换字符串。例如:

    例如,从此:

    RewriteRule (.*) index.php?/$1 [L]

    对此:

    RewriteRule . index.php [L]

关于php - 从 CodeIgniter 中删除并重定向 index.php,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60169302/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com