htaccess重写问题 - 继续重写

时间:2013-11-12 09:26:33

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

我正在尝试对域进行一些重写。 htaccess目前设置为在正斜杠之后考虑一些事情。例如。 mysite.dev/page1 /

我希望将其更改为: mysite.dev/page1.html

所以我在原始链接上放了一个前进,并为.html页面设置了新的重写,如下所示:

Redirect 301 /page1/ http://mysite.dev/page1.html
Redirect 301 /page1 http://mysite.dev/page1.html
Redirect 301 /page2/ http://mysite.dev/page2.html
Redirect 301 /page2 http://mysite.dev/page2.html
Redirect 301 /page3/ http://mysite.dev/page3.html
Redirect 301 /page3 http://mysite.dev/page3.html

RewriteRule ^page1.html$ page.php?slug=page1 [L]
RewriteRule ^page2.html$ page.php?slug=page2 [L]
RewriteRule ^page3.html$ page.php?slug=page3 [L]

RewriteRule ^([^/.]+)/?$ page.php?slug=$1 [L]
RewriteRule ^([^/.]+)/([^/.]+)/?$ page.php?slug=$2 [L]

去mysite.dev/page1.html时工作正常。但是当放入mysite.dev/page1/时,它会重写为mysite.dev/page1.html?slug=page1。所以它似乎继续遵循其他规则。

有关这方面的任何帮助/建议吗?

感谢。

1 个答案:

答案 0 :(得分:1)

避免混合使用mod_alias和mod_rewrite规则。

还要在第一个RewriteRule 之前添加此规则以避免循环:

## If the request is for a valid directory
RewriteCond %{REQUEST_FILENAME} -d [OR]
## If the request is for a valid file
RewriteCond %{REQUEST_FILENAME} -f [OR]
## If the request is for a valid link
RewriteCond %{REQUEST_FILENAME} -l
## don't do anything
RewriteRule ^ - [L]

完成.htaccess:

RewriteEngine On

RewriteCond %{THE_REQUEST} /(page1|page2|page3)[/\s\?] [NC]
RewriteRule ^ /%1.html [L,R=301]

## If the request is for a valid directory
RewriteCond %{REQUEST_FILENAME} -d [OR]
## If the request is for a valid file
RewriteCond %{REQUEST_FILENAME} -f [OR]
## If the request is for a valid link
RewriteCond %{REQUEST_FILENAME} -l
## don't do anything
RewriteRule ^ - [L]

RewriteRule ^(page1|page2|page3)\.html$ page.php?slug=$1 [L,QSA,NC]

RewriteRule ^([^/.]+)/?$ page.php?slug=$1 [L,QSA]

RewriteRule ^([^/.]+)/([^/.]+)/?$ page.php?slug=$2 [L,QSA]