我尝试了几个不同的问题:
上面的问题没有用,所以我开始开发一个替代方案,但我的代码返回404错误,多个请求( code1 ),并且一个请求运行良好( code2 )所以:
( code1 ) - 不要工作 - 多次请求( code2 ) - 工作正常 - 单一请求
Code1
Options +FollowSymLinks -MultiViews
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]*)/([^/]*)/([^/]*)/([^/]*)/([^/]*)/([^/]*)$ /~loja/index.php?a=$1&genero=$2&material=$3&cor=$4&tamanho=$5&Ordenacao=$6 [NC,L,QSA]
RewriteCond %{THE_REQUEST} ^.*/index\.php
RewriteRule ^(.*)index.php$ /~loja/$1/$2/$3/$4/$5/$6 [R=301,L]
DirectoryIndex index.php
现在看看正确的代码:
Code2
Options +FollowSymLinks -MultiViews
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([a-zA-Z0-9_-]+)$ /~loja/index.php?a=$1 [NC,L,QSA]
RewriteCond %{THE_REQUEST} ^.*/index\.php
RewriteRule ^(.*)index.php$ /~loja/$1 [R=301,L]
DirectoryIndex index.php
( code1 )有什么问题?
1 回答
第一个规则集不起作用,因为目标网址包含7个细分,但
RewriteRule
匹配6个细分 . 如果在RewriteRule
中的$
之前添加另一个/([^/]*)
,它将起作用 .所以,它是:
您可以通过在其末尾添加
?
字符来使分段/字符可选 .第一个规则集的第二部分完全错误,没有用处 . 首先,您应该注意
THE_REQUEST
变量包含完整的HTTP请求行作为documentation states:您不想使用它,请改用
REQUEST_URI
.404
您收到404错误的原因是因为
RewriteRule
无法匹配请求URI,因此URL不会被重写为index.php . 该目录层次结构在文件系统上不存在,因此404 .可选的URI段
您的原始规则集期望精确计算URI参数 . 如果您需要更加灵活,可以尝试使用此规则集,该规则集接受1-7个段并将它们映射到查询字符串:
测试时,请注意空查询字符串 . 在PHP方面,您需要使用
empty()
而不是isset()
来查看查询字符串是否存在 . 因为它们总是被设定,但是空的 .不包括管理员/
为了排除要在
admin/
路径上应用的规则,您可以像这样更新上面的RewriteCond
: