我正在处理一个项目,但我遇到了一些.htaccess
重写规则,该规则无法正常工作。我尝试过很多东西但没有运气,所以请帮助我。
这是我正在做的事情:
当我打开时:domain.com/us/search.html?keyword=xyz&location=alabama
它必须从根目录&读取文件search.php
。像这样工作:search.php?directory=us&keyword=xyz&location=alabama
正确获取子目录,但没有获取关键字和位置数据。
这是我的.htaccess
代码:
Options +FollowSymlinks
RewriteEngine on
RewriteCond %{HTTP_HOST} ^domain.com [NC]
RewriteRule ^(.*)$ http://www.domain.com/$1 [L,R=301]
RewriteRule ^(.*)/(.*)-ad(.*).html ad.php?countrycode=$1&title=$2&id=$3 [NC]
RewriteRule ^(.*)/$ country.php?countrycode=$1 [NC]
RewriteRule ^(.*)/(.*)-author\.html author.php?countrycode=$1&q=$2 [NC]
RewriteRule ^(.*)/(.*)-author/currentpage=(.*) author.php?countrycode=$1&q=$2¤tpage=$3 [NC]
RewriteRule ^(.*)/search\.html?keyword=(.*)&location=(.*) search.php?countrycode=$1&keyword=$2&location=$3 [NC,L]
RewriteRule ^(.*)/search\.html$ search.php?countrycode=$1 [NC,L]
RewriteRule ^(.*)/latest\.html$ latest.php?countrycode=$1 [NC,L]
RewriteRule ^(.*)/submit\.html$ submit.php [NC,L]
RewriteRule ^error\.html$ error.php [NC,L]
ErrorDocument 400 /error.html
ErrorDocument 401 /error.html
ErrorDocument 403 /error.html
ErrorDocument 404 /error.html
ErrorDocument 500 /error.html
答案 0 :(得分:1)
相关规则是
RewriteRule ^(.*)/search\.html$ search.php?countrycode=$1 [NC,L]
通常RewriteRule
会保留现有的查询字符串,除非您自己添加
修改查询字符串
默认情况下,查询字符串不会更改。但是,您可以在包含查询字符串部分的替换字符串中创建URL。只需在替换字符串中使用问号,即表示应将以下文本重新注入查询字符串。如果要删除现有查询字符串,请仅使用问号结束替换字符串。要组合新旧查询字符串,请使用[QSA]标志。
要保留上一个查询字符串,您必须添加QSA|qsappend
标记
RewriteRule ^(.*)/search\.html$ search.php?countrycode=$1 [NC,L,QSA]
这会无条件地重写search.html
。
如果您只想在请求包含查询字符串keyword=xyz&location=alabama
时重写它,则必须在规则前添加RewriteCond
%{QUERY_STRING}
RewriteCond %{QUERY_STRING} keyword=.+?&location=.
RewriteRule ^(.*)/search\.html$ search.php?countrycode=$1 [NC,L,QSA]
P.S。在开始时,您要编写search.php?directory=us&...
,但在规则中search.php?countrycode=...
。相应地调整规则。
答案 1 :(得分:0)
这是工作.htaccess
:
Options +FollowSymlinks
RewriteEngine on
RewriteCond %{HTTP_HOST} ^domain.com [NC]
RewriteRule ^(.*)$ http://www.domain.com/$1 [L,R=301]
RewriteRule ^(.*)/(.*)-ad(.*).html ad.php?countrycode=$1&title=$2&id=$3 [NC]
RewriteRule ^(.*)/$ country.php?countrycode=$1 [NC]
RewriteRule ^(.*)/(.*)-author\.html author.php?countrycode=$1&q=$2 [NC]
RewriteRule ^(.*)/(.*)-author/currentpage=(.*) author.php?countrycode=$1&q=$2¤tpage=$3 [NC]
RewriteCond %{QUERY_STRING} keyword=(.*)&location=(.*)
RewriteRule ^(.*)/search\.html search.php?countrycode=$1&keyword=%1&location=%2 [NC,L]
RewriteRule ^(.*)/search\.html$ search.php?countrycode=$1 [NC,L]
RewriteRule ^(.*)/latest\.html$ latest.php?countrycode=$1 [NC,L]
RewriteRule ^(.*)/submit\.html$ submit.php [NC,L]
RewriteRule ^error\.html$ error.php [NC,L]
ErrorDocument 400 /error.html
ErrorDocument 401 /error.html
ErrorDocument 403 /error.html
ErrorDocument 404 /error.html
ErrorDocument 500 /error.html
RewriteRule
指令仅适用于请求路径,仅适用于?
符号。可以通过?
和变量RewriteCond
检查%{QUERY_STRING}
符号之后的所有内容。
您可以在mod_rewrite
的日志中看到更改RewriteRule + RewriteCond
:
[rewrite:trace3] applying pattern '^(.*)/search\\.html' to uri 'us/search.html'
[rewrite:trace4] RewriteCond: input='keyword=xyz&location=alabama' pattern='keyword=(.*)&location=(.*)' => matched
[rewrite:trace2] rewrite 'us/search.html' -> 'search.php?countrycode=us&keyword=xyz&location=alabama'
对于匹配的RewriteCond
模式的反向引用,您必须使用%N
而不是$N
。