有关动态子目录

时间:2016-07-02 20:04:49

标签: php apache .htaccess mod-rewrite url-rewriting

我正在处理一个项目,但我遇到了一些.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&currentpage=$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

2 个答案:

答案 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&currentpage=$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