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

Nor*_*rse 13 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>
Run Code Online (Sandbox Code Playgroud)

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

anu*_*ava 52

这是您可以在.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]
Run Code Online (Sandbox Code Playgroud)

  • 在这些规则中需要更改这个`http:// site.com/index.php/Page/Param1/Param2`这样的网址,因为看起来整个网址在域名之后被切断了. (2认同)

小智 6

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]
Run Code Online (Sandbox Code Playgroud)

这样可以完成以下任务:

  • RewriteBase 不必要(当站点位于网络根目录下的子目录中时很有用)
  • index.php 如果存在则删除
  • 使用index.php原始请求中的完整查询字符串将请求路由到正确的位置

注意这一行:

RewriteRule ^(.*) - [E=BASE:%1]
Run Code Online (Sandbox Code Playgroud)

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