使用.htaccess从URL中删除'index.php'

我一直在尝试从这个网站的各种解决scheme,似乎没有工作。 我目前正在托pipehostgator。 这是我当前的.htaccess文件:

<IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ /index.php/$1 [L] </IfModule> <IfModule mod_suphp.c> suPHP_ConfigPath /home/user/php.ini <Files php.ini> order allow,deny deny from all </Files> </IfModule> 

这是在我的网站的根文件夹。 我也试过添加一个? 之后index.php并没有运气。 有谁知道为什么这不起作用?

这是您可以在.htaccess(在DOCUMENT_ROOT下)中使用的代码从URI中删除index.php:

 Options +FollowSymLinks -MultiViews # Turn mod_rewrite on RewriteEngine On RewriteBase / RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php?$1 [L,QSA] RewriteCond %{THE_REQUEST} ^[AZ]{3,}\s(.*)/index\.php [NC] RewriteRule ^ %1 [R=301,L] 

Symfony 2有一个很好的解决方案:

 RewriteCond %{REQUEST_URI}::$1 ^(/.+)/(.*)::\2$ RewriteRule ^(.*) - [E=BASE:%1] # Sets the HTTP_AUTHORIZATION header removed by apache RewriteCond %{HTTP:Authorization} . RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] RewriteCond %{ENV:REDIRECT_STATUS} ^$ RewriteRule ^index\.php(/(.*)|$) %{ENV:BASE}/$2 [R=301,L] RewriteCond %{REQUEST_FILENAME} -f RewriteRule .? - [L] RewriteRule .? %{ENV:BASE}/index.php [L] 

这完成了以下内容:

  • RewriteBase不是必须的(当站点位于Web根目录下的子目录中时很有用)
  • 如果存在, index.php被删除
  • 该请求被路由到正确的index.php与原始请求的完整查询字符串

请注意,该行:

 RewriteRule ^(.*) - [E=BASE:%1] 

负责设置%{ENV:BASE}变量以备后用。 请参阅E|env标志上的Apache文档 。

我试过这个工作正常:

 <Ifmodulee mod_rewrite.c> RewriteEngine On RewriteBase / # Removes index.php from ExpressionEngine URLs RewriteCond %{THE_REQUEST} ^GET.*index\.php [NC] RewriteCond %{REQUEST_URI} !/system/.* [NC] RewriteRule (.*?)index\.php/*(.*) /$1$2 [R=301,NE,L] # Directs all EE web requests through the site index file RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ /index.php/$1 [L] </Ifmodulee> 

例外

如果您的站点的系统目录(/ system /)已经被重命名并且仍然可以通过URL访问,请修改上面的RewriteCond行:

 RewriteCond %{REQUEST_URI} !/newdirectoryname/.* [NC] 

如果您是从子目录运行EE,而不是从域的根目录(例如http://example.com/myeesite/而不是http://example.com/ )运行,则只需删除前面的index.php中的斜杠即可上面的RewriteRule行如下所示:

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

如果您从子目录运行EE,并且删除斜杠后仍无法运行,则可能需要在重写规则中指定子目录。 例如,如果您的子文件夹被命名为测试,请更改:

 RewriteRule (.*?)index\.php/*(.*) /$1$2 [R=301,NE,L] 

至:

 RewriteRule (.*?)index\.php/*(.*) testing/$1$2 [R=301,NE,L] 

并改变:

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

至:

 RewriteRule ^(.*)$ testing/index.php/$1 [L] If your host requires forcing query strings, try adding a question mark following index.php in the RewriteRule line above, like so: RewriteRule ^(.*)$ /index.php?/$1 [L] 

更新的答案

这些天我只是使用Wordpress .htaccess作为基础:它是相对简单的,按预期工作:

 <Ifmodulee mod_rewrite.c> RewriteEngine On RewriteBase / RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] </Ifmodulee> 

如果您愿意,也可以直接使用https://

 <Ifmodulee mod_rewrite.c> RewriteEngine On RewriteCond %{HTTPS} !=on RewriteRule (.*) https://%{HTTP_HOST} [L,R=301] RewriteBase / RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] </Ifmodulee> 

原始帖子从2012年起

我最初的建议是首先做一个硬重定向( index.php ),然后把内部重定向回index.php

问题是贪婪的内部重定向匹配(例如使用(.*) )似乎再次触发硬重定向,导致无限重定向循环。

我觉得有一个比我想提出的更优雅的解决方案,但不幸的是,我没有Apache的知识来思考它。

我会做的是有一个RewriteRule执行硬重定向index.php ,然后一组内部重定向规则从那里采取。 例如:

 <Ifmodulee mod_rewrite.c> RewriteEngine On RewriteRule ^index\.php(.*)$ /$1 [R,L,QSA] RewriteRule ^pie$ /index.php?pie [L,QSA] </Ifmodulee> 

这似乎工作正常,没有产生任何500错误。 但是,我再次推荐一小撮盐。

虽然这是一个很好的解决方案相差很远,但我希望它有帮助。

我今天被迫加入了overflow.com,在这里发表评论,因为答案已经解决了我在Zend Framework网站上遇到的一个长期问题。 我在网站上工作了三年半左右,在那段时间里,我发现它没有正确处理index.php,这导致网站管理员工具看到重复的标题等。

我决定今天再次搜索一个解决方案,尝试多次。

这是解决我的问题的那个(上面显示的最后一个答案)。

  # Removes index.php from ExpressionEngine URLs RewriteCond %{THE_REQUEST} ^GET.*index\.php [NC] RewriteCond %{REQUEST_URI} !/system/.* [NC] RewriteRule (.*?)index\.php/*(.*) /$1$2 [R=301,NE,L] 

举个例子。 这是它为我实现的。

http://www.domainname.co.uk/index.php/categories/url-name.html

http://www.domainname.co.uk/categories/url-name.html

感谢所有对原始问题做出贡献的人,因为这导致了上面的答案和解决方案。

额外的注意事项:我有其他的重写命令处理其他方面,但这些自己没有修复index.php,唯一的时间已经被修复是通过使用。

 # Removes index.php from ExpressionEngine URLs RewriteCond %{THE_REQUEST} ^GET.*index\.php [NC] RewriteCond %{REQUEST_URI} !/system/.* [NC] RewriteRule (.*?)index\.php/*(.*) /$1$2 [R=301,NE,L] 

我只希望在将来能够帮助其他人使用ExpressionEngine或Zend Framework。

要从apache2.4的 url上删除index.php ,你可以使用下面的规则:

  RewriteEngine on RewriteRule ^index\.php/(.+)$ /$1 [L,R] RewriteCond %{REQUEST_FILENAME} !-d RewriteRule !index\.php /index.php%{REQUEST_URI} [L,END] 

这将改变uri

 /index.php/foobar 

 /foobar 

此规则将返回较低版本的Apache的内部服务器错误,因为它们不支持END标志。 请参阅上面的anubhava的答案几乎所有版本的作品。