这个Apache URL重写规则有什么问题?

我想redirecthttp://abc.xyz.ac.uk/folders/abc/lmn http://abc.xyz.ac.uk/folders/abc/lmn.html

这里是我启用这个代码

<Directory /var/www/folders> RewriteEngine on RewriteRule ^/abc/lmn$ ^/abc/lmn.html [NC,L] Options Indexes FollowSymLinks MultiViews AllowOverride None Order allow,deny allow from all </Directory> 

这条规则有什么问题,这是否包含重写的正确位置?

谢谢

重写path在<Directory >上下文中以不同的方式工作。 您匹配的path是删除当前目录(包括结尾的斜杠)的完整文件系统path。

这样做的效果是,您需要从正则expression式和replace字段中删除前导斜杠,或者将重写规则移到目录上下文之外,在那里它将匹配URI而不是文件系统path。

请注意, .htaccess文件隐含在目录上下文中,因为它位于目录中。

你也不应该有一个插入在更换。 第二个参数不是一个正则expression式。

你在你的问题中提到了一个redirect 。 为了做到这一点,在第二个参数之后需要[R]或者一个更具体的代码( [R=301]或者[R=303] )。

试试这个:

 RewriteRule ^/abc/lmn$ /abc/lmn.html [NC,L] 

按照https://httpd.apache.org/docs/current/mod/mod_rewrite.html#rewriterule,RewriteRule的参数是一个模式,一个replace和一些标志&#x3002; ^字符将被视为replace部分中的文字,这可能不是您想要的。

mod_rewrite具有出色的日志logging,这对debugging这类问题很有帮助。 使用LogLevel alert rewrite:trace3启用它,然后调整trace8以上的级别,以获得所需的详细级别。 有关日志logging的更多细节:

https://httpd.apache.org/docs/current/mod/mod_rewrite.html#logging

尝试以下操作:

 <Directory /var/www/folders> RewriteEngine on RewriteBase /folders RewriteRule ^/abc/lmn$ /abc/lmn.html [NC,L] Options Indexes FollowSymLinks MultiViews AllowOverride None Order allow,deny allow from all </Directory>