我想要做的是,如果网址有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
到/
重定向。
答案 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]