htaccess没有按预期工作

时间:2016-01-10 19:43:36

标签: php apache .htaccess mod-rewrite

我有一个htaccess重写网址如下:

RewriteEngine On
RewriteCond %{HTTP_HOST} ^www.mywebsite.com$ [NC]
RewriteRule ^(.*)$ http://mywebsite.com/$1 [R=301,L]

RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f


RewriteRule ^my-page\.html$ /my-page.php [L]
RewriteRule ^my-page/([^/]*)\.html$ /level1.php?num=$1 [L]
RewriteRule ^my-page/([^/]*)/([^/]*)\.html$ /level2.php?level1=$1&level2=$2 [L]
RewriteRule ^([^/]*)\.html$ /level3.php?level3=$1 [L]

以上这些规则会重写从mywebsite.com/my-page.phpmywebsite.com/my-page.html的网址。

现在,我要实现的目标是mywebsite.com/my-page/被重定向到mywebsite.com/my-page.php(后者又会重写为mywebsite.com/my-page.html)。

我尝试过,我创建了一个目录" my-page"并尝试将请求从mywebsite.com/my-page/重定向到/my-page.html

我不知道出了什么问题。我可以在网络标签中看到向/my-page/发出请求并将其重写为mywebsite.com/my-page.htmlmy-page/,这会产生302状态☹

请帮忙!谢谢。

2 个答案:

答案 0 :(得分:0)

您可以尝试使用RedirectMatch来实现此目的。

重定向到my-page.php:

RedirectMatch 301 ^/my-page/ http://mywebsite.com/my-page.php

如果这是您的目标,请立即访问my-page.html:

RedirectMatch 301 ^/my-page/ http://mywebsite.com/my-page.html

或者,什么是最好的 - 更改负责mywebsite.com/my-page.htmlmy-page/的代码,但我看不出你问的问题:)

答案 1 :(得分:0)

请试试以下内容。每个部分的评论中都有简要说明。

RewriteEngine On

# Trim www.
RewriteCond %{HTTP_HOST} ^www\.mywebsite\.com$ [NC]
RewriteRule ^(.*)$ http://mywebsite.com/$1 [R=301,L]

RewriteBase /

# Redirect /my-page[/] to /my-page.html
# >> Note: change 302 to 301 to make permanent
RewriteRule ^my-page/?$ my-page.html [R=302,L]

# Allow existing files and directories
# Recommended to comment out the first line
RewriteCond %{REQUEST_FILENAME} -d
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^ - [L]

# Rewrite *.html to respective page
RewriteRule ^my-page.html$ my-page.php [L]
RewriteRule ^my-page/([^/]*).html$ level1.php?num=$1 [L]
RewriteRule ^my-page/([^/]*)/([^/]*).html$ level2.php?level1=$1&level2=$2 [L]
RewriteRule ^([^/]*).html$ level3.php?level3=$1 [L]

这里的重要部分是您在进行任何其他重写之前执行所需的重定向(www.删除除外)。

此外,您之前有两个条件,即如果请求不是针对文件或目录,则继续执行下一个规则,但这不会考虑最后两个规则。因此,如果请求是针对现有文件或目录,则此版本告诉Apache停止所有内容。出于安全考虑,我建议您注释掉检查现有目录的行。