在过去的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看到别的东西?
答案 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。