Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在.htaccess中同时使用mod_重写和mod_别名(重定向301)?_.htaccess_Mod Rewrite_Redirect_Mod Alias - Fatal编程技术网

在.htaccess中同时使用mod_重写和mod_别名(重定向301)?

在.htaccess中同时使用mod_重写和mod_别名(重定向301)?,.htaccess,mod-rewrite,redirect,mod-alias,.htaccess,Mod Rewrite,Redirect,Mod Alias,我有一个网站,里面有一组旧的.html和.php页面,这些页面已经放入CMS中 当前在.htaccess文件中,大约有30个mod_别名重定向,格式如下: redirect 301 /oldpage1.html http://www.example.com/newpage1.php redirect 301 /oldpage2.php http://www.example.com/newpage2.php redirect 301 /oldpage3.php http://www.example

我有一个网站,里面有一组旧的.html和.php页面,这些页面已经放入CMS中

当前在.htaccess文件中,大约有30个mod_别名重定向,格式如下:

redirect 301 /oldpage1.html http://www.example.com/newpage1.php
redirect 301 /oldpage2.php http://www.example.com/newpage2.php
redirect 301 /oldpage3.php http://www.example.com/newpage3.php
但是我们希望使用mod_rewrite在我们的CMS中拥有漂亮的URL,其形式为
http://www.example.com/pagename.php
,因此也有以下内容:

RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)$ index.php?page=$1
目前,这两种方法同时应用,导致:

http://www.example.com/newpage1.php?page=oldpage1.html
仅当mod_alias redirect 301语句未进行匹配时,如何应用重写规则,从而发生以下情况:

http://www.example.com/oldpage1.html
->重定向到->
http://www.example.com/newpage1.php
->被视为->
http://www.example.com/index.php?page=/newpage1.php

如有任何提示,将不胜感激?谢谢。

我在一份报告中找到了答案

问题是mod_重写总是发生在mod_别名之前,而不管它们在.htaccess中的顺序如何。这与这种情况所需的顺序相反

诀窍是使用
RewriteRule[R=301]
而不是
redirect 301
,因此对所有内容都使用mod_rewrite,而不是将其与mod_别名混合使用

完整的解决方案如下:

RewriteEngine on
RewriteBase /

RewriteRule ^oldpage1.html /newpage1.php [R=301,L]
RewriteRule ^oldpage2.php /newpage2.php [R=301,L]
RewriteRule ^oldpage3.php /newpage3.php [R=301,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)$ index.php?page=$1