通过子目录中的 htaccess 删除 id 和 index.php
remove id and index.php via htaccess in subdirectory
当前 URL:
domain/index.php?id=p123
我要:
- 添加 www
- 删除:index.php
- 删除 'id' 表格 URL
我是这样做的:
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= [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/*(.*) / [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
我会这样处理:
首先,将非 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 ^(.*/)?([^/]+)$ /index.php?id= [L]
接下来,处理其中包含 index.php
的原始 URI:
RewriteCond %{THE_REQUEST} ^GET\ /(.*/)?(?:index\.php)?\?id=([^\s&]+) [NC]
RewriteRule ^ /%1%2? [R=301,L]
最后一条规则也会处理像 domain.com/dir/?id=sth
和 domain.com/dir/index.php?id=sth
这样的 URL
您可以通过以下更改完成此操作:
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 ^(.*/|)([^/]*)$ index.php?id= [L]
我们知道 %{THE_REQUEST}
具有格式 GET /path/to/index.php?id=12312412 HTTP/1.1
或类似的格式。在第一条规则中,我们匹配 \
,这是一个文字 space,然后是始终存在的开始斜杠。 (.*/|)
将匹配 index.php 之前的所有内容,或者完全不匹配。我们在第二条规则中使用的技巧相同。当特定目录不存在 index.php 时,我添加了 RewriteCond %{REQUEST_URI} !index\.php
以防止无限循环。
当前 URL:
domain/index.php?id=p123
我要:
- 添加 www
- 删除:index.php
- 删除 'id' 表格 URL
我是这样做的:
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= [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/*(.*) / [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
我会这样处理:
首先,将非 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 ^(.*/)?([^/]+)$ /index.php?id= [L]
接下来,处理其中包含 index.php
的原始 URI:
RewriteCond %{THE_REQUEST} ^GET\ /(.*/)?(?:index\.php)?\?id=([^\s&]+) [NC]
RewriteRule ^ /%1%2? [R=301,L]
最后一条规则也会处理像 domain.com/dir/?id=sth
和 domain.com/dir/index.php?id=sth
您可以通过以下更改完成此操作:
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 ^(.*/|)([^/]*)$ index.php?id= [L]
我们知道 %{THE_REQUEST}
具有格式 GET /path/to/index.php?id=12312412 HTTP/1.1
或类似的格式。在第一条规则中,我们匹配 \
,这是一个文字 space,然后是始终存在的开始斜杠。 (.*/|)
将匹配 index.php 之前的所有内容,或者完全不匹配。我们在第二条规则中使用的技巧相同。当特定目录不存在 index.php 时,我添加了 RewriteCond %{REQUEST_URI} !index\.php
以防止无限循环。