如何使用mod_write从url中删除index.php,同时仍允许php查看index.php中的路径?

时间:2012-07-19 19:07:20

标签: mod-rewrite

在过去的3天里,我一直在玩Apache的mod_rewrite试图让它从我的url中删除index.php,而php仍然需要在路径中看到它。

Essentially PHP needs to see this
http://example.com/index.php/Page/Param1/Param2

While the user needs to see this
http://example.com/Page/Param1/Param2

我现在所拥有的是htaccess文件中的以下内容

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]

这是从另一页获取的,并且接近我需要的内容。然而,这似乎在http://example.com/部分之后切断了所有内容。我如何让mod_rewrite向用户显示一件事并让php看到别的东西?

2 个答案:

答案 0 :(得分:1)

这条规则:

RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s(.*)/index\.php [NC]
RewriteRule ^ /%1 [R=301,L]

需要看起来像这样:

RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\ /index\.php(.*)\  [NC]
RewriteRule ^ /%1 [R=301,L]

另请注意,RewriteRule ^(.*)$ index.php?$1 [L,QSA]不会创建类似于此/index.php/Page/Param1/Param2的URI,它会创建一个如下所示的查询字符串:/index.php?Page/Param1/Param2。这根本不是你所说的PHP所需要的。

答案 1 :(得分:1)

这是您可以在.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)^(.+)$ /index.php/$1 [L,NC]

RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s(.*)/index\.php(/[^\s\?]+)? [NC]
RewriteRule ^ %1%2 [R=302,L]

一旦您确信它适合您,就将R = 302更改为R = 301。