Url Rewrite:如何为“静态”动态网址和动态网址设置.htaccess

时间:2013-02-02 19:47:59

标签: apache mod-rewrite url-rewriting

我做了几次没有成功的尝试。 这就是我想用“静态动态网址”来表达的意思:

index.php?content=authors   => /compositori/
index.php?content=albums    => /dischi/

查询字符串变量值“authors”需要成为“compositori”,我试过这个但没有尝试:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^compositori/$ index.php?content=authors - [R=301,L]
</IfModule>

这适用于动态网址:

index.php?content=author&c=nome-compositore => /nome-compositore/
index.php?content=author&c=nome-compositore&action=view-bio => /nome-compositore/biografia/
index.php?content=author&c=nome-compositore&action=view-albums  => /nome-compositore/dischi/
index.php?content=author&c=nome-compositore&action=view-album&a=nome-disco  => /nome-compositore/nome-disco/

然后我想将这个网址“index.php?content = index”重定向到主页,没有任何查询字符串参数,并且在.com,index.php?content = index =&gt;之后没有任何内容。 www.mydomain.com

对于所有这些规则,我还需要让它们在子文件夹上工作,其中htaccess位于此子文件夹中,例如mydomain.com/test/。尝试使用RewriteBase但没有:/

提前致谢

编辑: 现在我有这些规则归功于大卫:

RewriteRule ^/?$ /subfolder/index.php?content=index [L]
RewriteRule ^contatti/$ /subfolder/index.php?content=contacts [L]
RewriteRule ^compositori/$ /subfolder/index.php?content=authors [L]
RewriteRule ^dischi/$ /subfolder/index.php?content=albums [L]
RewriteRule ^(.+)/biografia/$ /subfolder/index.php?content=author&c=$1&action=view-bio [L]
RewriteRule ^(.+)/dischi/$ /subfolder/index.php?content=author&c=$1&action=view-albums [L]
RewriteRule ^(.+)/(.+)/$ /subfolder/index.php?content=author&c=$1&action=view-album&a=$2 [L]

但是我注意到如果我在url中放入非重写的查询字符串(index.php?content = authors),它会加载内容但保留非格式化字符串,而不是重定向到重写的url。我试过把[R = 301,L]但没什么可做的。这是我的上一期。

再次感谢

1 个答案:

答案 0 :(得分:0)

RewriteRule ^compositori/$ index.php?content=authors - [R=301,L]

这有两个原因无效:您有三个规则区域而不是必需的两个区域(末尾额外-)并且您缺少前导斜杠。您还将其设置为重定向(R=301),但可能只是想重写。这应该改为:

RewriteRule ^compositori/$ /index.php?content=authors [L]

一旦你开始工作,你发布的剩余转换应该会有相似的效果。

  

然后我想将此网址“index.php?content = index”重定向到主页   页面没有任何查询字符串参数,在.com后没有任何内容   index.php?content = index =&gt; www.mydomain.com

您正在使用术语“重定向”,但根据前面示例中箭头的方向,您可能意味着“重写”相反的方向,所以这里是两种方式的答案:

让用户输入www.mydomain.com并让服务器实际加载index.php?content=index(我认为你的意思):

RewriteRule ^/?$ /index.php?content=index [L]

真正让index.php?content=index重定向到www.mydomain.com

RewriteCond %{QUERY_STRING} ^content=index$
RewriteRule ^index.php$ http://www.mydomain.com/ [R=301,L]

编辑:关于将查询字符串的完整路径重定向到“漂亮”URL的最后一个问题,您将实现我在上面写的内容(RewriteCond + RewriteRule),用于每个特定的重写,您可以将上述规则放在上面您现有的(新)规则。换句话说:

RewriteCond %{QUERY_STRING} ^content=index$
RewriteRule ^subfolder/index.php$ http://www.mydomain.com/ [R=301,L]

RewriteCond %{QUERY_STRING} ^content=contacts$
RewriteRule ^subfolder/index.php$ http://www.mydomain.com/contatti/ [R=301,L]

... repeat for remaining rules

RewriteRule ^/?$ /subfolder/index.php?content=index [L]
RewriteRule ^contatti/?$ /subfolder/index.php?content=contacts [L]

... repeat for remaining rules

这会将带有查询字符串的每个完整URL重定向到漂亮的URL,然后将静态URL重写为完整的URL。关于您在上面列出的新规则的几点说明:

首先,您为原始问题中不存在的每个规则添加了/子文件夹。如果您希望规则适用于子文件夹或不使用子文件夹,您可以在括号中添加该部分,并在末尾添加问号,如:

RewriteRule ^(subfolder/)?index.php$ http://www.mydomain.com/ [R=301,L]

此外,您编写的新规则要求匹配路径以斜杠结尾。由于以斜杠结尾或不以斜杠结尾的目录路径是等效的,您应该通过在斜杠之后添加问号来使其成为可选项,就像我在上面的示例中所做的那样(contatti/?):