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

时间:2012-03-07 20:12:23

标签: regex apache .htaccess mod-rewrite redirect

我一直在尝试这个网站的各种解决方案,但似乎都没有。我目前正在托管主持人。这是我目前的.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而没有运气。有谁知道为什么这不起作用?

6 个答案:

答案 0 :(得分:50)

这是您可以在.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} ^[A-Z]{3,}\s(.*)/index\.php [NC]
RewriteRule ^ %1 [R=301,L]

答案 1 :(得分:5)

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不是必需的(当网站位于网络根目录下的子目录中时很有用)
  • index.php如果存在则被删除
  • 请求将使用原始请求中的完整查询字符串路由到正确的index.php

请注意以下行:

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

负责设置%{ENV:BASE}变量以供日后使用。请参阅Apache documentation on E|env flag

答案 2 :(得分:1)

更新了答案

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

<IfModule mod_rewrite.c>
RewriteEngine On

RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

如果你愿意,也可以直接强制https://

<IfModule 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]
</IfModule>

2012年的原帖

我的初步建议是首先进行硬重定向(剥离index.php),然后将内部重定向重新导向index.php

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

我觉得有一个更优雅的解决方案,而不是我要提出的建议,但不幸的是我没有Apache的专业知识来考虑它。

我要做的是让RewriteRule执行硬重定向以删除index.php,然后执行一组内部重定向规则以从中获取它。例如:

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

这似乎可以正常工作而不会产生任何500错误。但同样,我推荐一小撮盐。

虽然这与一个好的解决方案相去甚远,但我希望它有所帮助。

答案 3 :(得分:1)

我试过这个并且工作正常:

<IfModule 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]
</IfModule>

例外

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

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

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

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

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

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]

答案 4 :(得分:0)

我今天被迫加入stack overflow.com在这里发表评论,因为答案解决了我在Zend Framework网站上遇到的长期问题。我在网站上工作了大约3年半,在此期间我发现它没有正确处理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。

答案 5 :(得分:0)

要从 apache2.4 上的网址中删除 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的答案几乎适用于所有版本。