我有一个网站,这是基于一个search页面,显示一个列表,接下来是一个细节页面的项目。
如果访问者使用rootdomain.com/searchterm ,应将其redirect到rootdomain.com/index.php?keyword=searchterm 。
我现在正在工作的细节rootdomain.com/detail/productname ,应该redirect到rootdomain.com/detail.php?name=productname
在这里我失败了
我一直使用我的$ 1作为“detail / productname”redirect到index.php,
这是我的.htacces到目前为止:
RewriteEngine on RewriteCond $1 !^(index\.php|resources|robots\.txt) RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^/detail/(.*)$ detail.php?name=$1 [L,QSA] -> L here doesn't work either. RewriteRule ^(.*)$ index.php?keyword=$1 [L,QSA]
更新
好的,我现在非常接近
问题是重写条件只对下一条规则有效,所以我必须重复一遍,我也在第一个条件中添加了ignore detail.php,因为我的redirect已经被redirect到索引。 现在由于某种原因,我的条件为-F似乎不能在细节/我所有的CSS和图像不工作。 排除他们的最好方法是什么?
RewriteEngine on RewriteCond $1 !^(index\.php|detail\.php|resources|robots\.txt) RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^detail/(.*)$ detail.php?name=$1 [L,QSA] RewriteCond $1 !^(index\.php|detail\.php|resources|robots\.txt) RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php?keyword=$1 [L,QSA]
更新2
所以我得到它的工作..但我想这不是最短的方式来做到这一点。 所以如果任何人有兴趣可以随意缩短。
RewriteEngine on RewriteCond $1 !^(index\.php|detail\.php|resources|robots\.txt) RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^detail/(images|css|js)/(.*)$ $1/$2 [L,QSA] RewriteCond $1 !^(index\.php|detail\.php|resources|robots\.txt) RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^detail/(.*)$ detail.php?name=$1 [L,QSA] RewriteCond $1 !^(index\.php|detail\.php|resources|robots\.txt|\.png) RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php?keyword=$1 [L,QSA]
您需要将L ('last')标志添加到第一个RewriteRule :
RewriteRule ^/detail/(.*)$ detail.php?name=$2 [L,QSA]
根据文件 ,这个标志将:
停止重写过程,不要再应用任何重写规则。 这对应于C语言的最后一个命令或C语言中的break命令。使用此标志可防止当前重写的URL被以下规则进一步重写。
没有它,Apache会在匹配第一个之后继续应用第二个重写规则。 因为第二条规则会影响一切,所以会覆盖第一条。 (另一种解决scheme是编写你的模式,使得没有两个URL匹配相同的模式,例如通过将第二个模式改变为^[^/](.*)$ 。
所以我得到它的工作..但我想这不是最短的方式来做到这一点。 所以如果任何人有兴趣可以随意缩短。
发生了什么,第一个版本,从细节redirect/一些工作,但得到然后redirect到index.php?keyword = detail.php?name =东西,所以我不得不在第一个条件行排除detail.php。 rewriteCond也适用于下一条规则,而不是全部。 所以我不得不重复他们。
最后有我的图像和CSS的工作,我不得不重写他们的3个文件夹我有图像/ CSS / JS的基地址。
如果这可以做得更短或更充分,随时可以这样做
RewriteEngine on RewriteCond $1 !^(index\.php|detail\.php|resources|robots\.txt) RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^detail/(images|css|js)/(.*)$ $1/$2 [L,QSA] RewriteCond $1 !^(index\.php|detail\.php|resources|robots\.txt) RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^detail/(.*)$ detail.php?name=$1 [L,QSA] RewriteCond $1 !^(index\.php|detail\.php|resources|robots\.txt|\.png) RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php?keyword=$1 [L,QSA]
– 编辑它仍然不是愚蠢的certificate,当使用细节后面的urlencoded部分/ …