我尝试了几个不同的问题:
上面的问题没有用,所以我开始开发一个替代方案,但是我的代码在多个请求中返回404错误( code1 ),并且一个请求运行良好( code2 )所以:
( code1 ) - 不要工作 - 多次Resquest ( code2 ) - 工作正常 - 单一请求
代码1
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
现在看到正确的代码:
代码2
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 )有什么问题?
答案 0 :(得分:2)
第一个规则集无效,因为目标网址包含7个细分,但RewriteRule
匹配6个细分。如果您在/([^/]*)
中的$
之前添加了另一个RewriteRule
,那么它就会有效。
所以,它是:
RewriteRule ^([^/]*)/([^/]*)/([^/]*)/([^/]*)/([^/]*)/([^/]*)/([^/]*)$ /~loja/index.php?a=$1&genero=$2&material=$3&cor=$4&tamanho=$5&Ordenacao=$6 [NC,L,QSA]
您可以通过在其末尾添加?
字符来使分段/字符成为可选字段。
第一个规则集的第二部分是完全错误的,没有用处。首先,您应该注意THE_REQUEST
变量包含完整的HTTP请求行documentation states:
THE_REQUEST
包含浏览器发送给服务器的完整HTTP请求行(例如GET /index.html HTTP/1.1
)。这不包括浏览器发送的任何其他标头。与以下大多数其他变量不同,此值尚未转义(解码)。
您不想使用它,请改用REQUEST_URI
。
您收到404错误的原因是因为RewriteRule
无法匹配请求URI,因此URL不会被重写为index.php。文件系统上不存在该目录层次结构,因此是404。
您的原始规则集期望精确计算URI参数。如果您需要更加灵活,可以尝试接受1-7段并将其映射到查询字符串的规则集:
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !index\.php
RewriteRule ^([^/]*)/?([^/]*)/?([^/]*)/?([^/]*)/?([^/]*)/?([^/]*)/?([^/]*)$ /~loja/index.php?a=$1&genero=$2&material=$3&cor=$4&tamanho=$5&Ordenacao=$6 [NC,L,QSA]
</IfModule>
测试时,请注意空查询字符串。在PHP方面,您需要使用empty()
而不是isset()
来查看查询字符串是否存在。因为它们总是被设定,但却是空的。
admin/
为了排除要在admin/
路径上应用的规则,您可以像这样更新上述RewriteCond
:
RewriteCond %{REQUEST_URI} !(index\.php|admin)