使用.htaccess从URLS中删除index.php

时间:2014-01-28 04:35:51

标签: php .htaccess mod-rewrite redirect

我有一个index.php控制器,所有现有文件重定向到的URL都没有。 我目前的.htaccess规则如下:

RewriteEngine On
DirectorySlash Off

# Remove Trailing Slashes
RedirectMatch 302 ^(.*)/$ $1

# Remove WWW
RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteRule ^ http://%1%{REQUEST_URI} [R=302]

# Reroute to index.php
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L,QSA]

如果URL中包含index.php,我想要做的是使用301重定向。 但!我无法使用RewriteBase或以斜杠开头的查询,因为我正在开发的webapp可能位于子文件夹中。所以基本上,我只想重写当前目录:

example.com/foo/index.php/bar/whatever应该重定向到example.com/foo/bar/whatever example.com/foo/index/bar/whatever应该重定向到example.com/foo/bar/whatever

localhost / place / foo / index.php / bar /无论应该重定向到localhost / place / foo / bar /等等 localhost / place / foo / index / bar /还应该重定向到localhost / place / foo / bar /等等

如何使用.htaccess完成此操作?

更新后的代码: 这里的一切都有效除了: index.php不会从URL中的任何位置删除。

以下是代码:

<IfModule mod_rewrite.c>
RewriteEngine On
DirectorySlash Off

# Remove WWW
RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteRule ^ http://%1%{REQUEST_URI} [R=302,L]

# Remove Trailing Slashes
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{THE_REQUEST} \s(.+?)/+[?\s]
RewriteRule ^ %1 [R=302,L]

# Reroute to index.php
#RewriteCond $1 !^(index\.php)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?cURL=/$1 [L,QSA]

</IfModule>

3 个答案:

答案 0 :(得分:2)

将mod_rewrite规则与mod_alias规则混合使用并不是一个好主意。请尝试更新.htaccess

<IfModule mod_rewrite.c>
RewriteEngine On
DirectorySlash Off

# Remove WWW
RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteRule ^ http://%1%{REQUEST_URI} [R=302,L]

# Remove Trailing Slashes
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{THE_REQUEST} \s(.+?)/+[?\s]
RewriteRule ^ %1 [R=302,L]

# remove index.php
RewriteCond %{THE_REQUEST} /index\.php[\s?/] [NC]
RewriteRule ^(.*?)index\.php(/.*)?/?$ /$1$2 [L,R=301,NC,NE]

# Reroute to index.php
RewriteCond $1 !^(index\.php)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?cURL=/$1 [L,QSA]
</IfModule>

答案 1 :(得分:1)

确保在服务器上进行mod重写尝试

RewriteEngine on
RewriteCond $1 !^(index\.php)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?/$1 [L]

答案 2 :(得分:0)

你可以这样使用

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?/$1 [L]