如果url有index.php / somefileOrsomedirectory,如何重定向

时间:2017-01-06 15:32:28

标签: php regex apache .htaccess redirect

我想要做的是,如果网址有www.example.com/index.php/anything,那么它应该将用户引向www.example.com/error-404 这是我在htaccess文件中的当前表达式。

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?$1 [L,QSA]
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s(.*)/index\.php [NC]
RewriteRule ^ %1 [R=301,L]

RewriteCond %{HTTP_HOST} !^www.example.com$ [NC]
RewriteRule (.*)$ http://www.example.com/$1 [L,R=301]
Redirect 301 /online-features/key-anywhere-web-based-system http://www.example.com/online-features
Redirect 301 /home http://www.example.com/

提前致谢。 如果我没有以正确的方式提出问题,请建议/编辑我的问题。

修改 我不想放弃/index.php/重定向。

2 个答案:

答案 0 :(得分:2)

我认为以下内容应该符合您的要求。点是任何字符,+表示一次或多次。 这需要正斜杠

RewriteRule ^index\.php/(.+)$ error-404 [L]

编辑:感谢@DocRoot,相应更新

答案 1 :(得分:2)

  

www.example.com/index.php/anything

/anything这里是附加的路径信息(在物理文件的名称之后)。您可以使用AcceptPathInfo指令专门禁用此“功能”:

AcceptPathInfo Off

在这种情况下,包含其他路径信息的所有URL都会自动触发404.但是,仍然可以使用mod_rewrite路由URL,这可能就是这里发生的事情。

您仍需要实现datascript的答案中提到的mod_rewrite重定向。或者在现有指令之前尝试以下内容:

RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^index\.php/ /error-404 [R=302,L]

REDIRECT_STATUS的检查是为了避免重写循环,因为前端控制器似乎使用路径信息来路由请求。

如果您确定它是永久性的,一旦您确认它正常工作,请将其更改为301

但是,如果将其作为正确的Apache错误文档实现,则更为可取。例如:

ErrorDocument /error-404.php

RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^index\.php/ - [R=404,L]