通过子目录中的htaccess删除id和index.php

时间:2015-11-04 09:01:26

标签: .htaccess mod-rewrite url-rewriting url-redirection friendly-url

当前网址:

domain/index.php?id=p123

我想:

  1. 添加www
  2. 除去:的index.php
  3. 删除' id'表格网址
  4. 我是这样做的:

    RewriteCond %{THE_REQUEST} /(?:index\.php)?\?id=([^\s&]+) [NC]
    RewriteRule ^ /%1? [R=302,L,NE]
    
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ /index.php?id=$1 [L]
    
    RewriteCond %{THE_REQUEST} /(?:index\.php)?\?id=([^\s&]+) [NC]
    RewriteRule ^ /%1? [R=302,L,NE]
    
    
    RewriteCond %{THE_REQUEST} ^GET.*index\.php [NC]
    RewriteRule (.*?)index\.php/*(.*) /$1$2 [R=301,NE,L]
    
    RewriteCond %{HTTP_HOST} !^$
    RewriteCond %{HTTP_HOST} !^www\. [NC]
    RewriteCond %{HTTPS}s ^on(s)|
    RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
    

    如果domian没有子目录,它就可以工作。

    如何更改此代码以支持子目录,如下所示:

    domian/subdirectory/index.php?id=p123
    

2 个答案:

答案 0 :(得分:3)

我会这样做:

首先,将非www网址重定向到www:

RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteCond %{HTTPS}s ^on(s)|
RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

将友好的URL重写为相应的index.php个文件:

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

接下来,处理其中包含index.php的原始URI:

RewriteCond %{THE_REQUEST} ^GET\ /(.*/)?(?:index\.php)?\?id=([^\s&]+) [NC]
RewriteRule ^ /%1%2? [R=301,L]

最后一条规则还会处理domain.com/dir/?id=sthdomain.com/dir/index.php?id=sth

等网址

答案 1 :(得分:2)

您可以通过以下更改来完成此操作:

RewriteCond %{THE_REQUEST} \ /(.*/|)(?:index\.php)?\?id=([^\s&]+) [NC]
RewriteRule ^ /%1%2? [R=302,L,NE]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !index\.php
RewriteRule ^(.*/|)([^/]*)$ $1index.php?id=$2 [L]

我们知道%{THE_REQUEST}的格式为GET /path/to/index.php?id=12312412 HTTP/1.1或类似的内容。在第一个规则中,我们匹配\,这是一个文字空间,然后是始终存在的开始斜杠。 (.*/|)将匹配所有内容,直到index.php,或者完全没有。我们在第二条规则中做的同样的伎俩。我已添加RewriteCond %{REQUEST_URI} !index\.php以防止在特定目录中不存在index.php时出现无限循环。