- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个旧项目,它有一些奇怪的问题。其 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-uri
和https://www.website .com/index.php/my-seo-friend-uri
到 https://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/
我是一名优秀的程序员,十分优秀!