如何编写.htaccess规则,以便在更改目录名后将所有URL重定向到新URL?

时间:2012-11-15 12:11:50

标签: .htaccess

我在我的网站上重命名了一个目录。如何将所有现有网址重定向到新网址。

例如,我将“MyFolder”重命名为“mydirectory”。那么,如何使用.htaccess文件中的某些规则将http://mywebsite.com/MyFolder/somepage.html重定向到http://mywebsite.com/mydirectory/somepage.htmlhttp://mywebsite.com/MyFolder/anotherpage.htmlhttp://mywebsite.com/mydirectory/anotherpage.html等。

以下是我的.htaccess文件的内容。这与WordPress的其他一些规则有关。

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

RewriteRule ^/Wordpress/(.*)$ http://example.com/wordpress/$1 [R=301,L]

</IfModule>

# END WordPress

所以RewriteRule ^/Wordpress/(.*)$ http://example.com/wordpress/$1 [R=301,L]应该按照我的知识运作。但它不起作用。

有趣的是,以下规则解决了我的问题。但我想学习如何。

Redirect 301 /Wordpress/ http://example.com/wordpress/

请告诉我这是如何运作的。

1 个答案:

答案 0 :(得分:0)

你有一些问题。

在.htaccess中匹配网址时,请务必记住您在RewriteRule中匹配的值是相对路径,而不是完整的URI(即它不包含根斜杠)。您可以将其删除,也可以将其设置为可选,以使您的代码可以在VirtualHosts和.htaccess之间转移

RewriteRule ^/?Wordpress/(.*)$ http://example.com/wordpress/$1 [R=301,L]

你的第二个问题是你有一个RewriteRule匹配所有的URL并且在你的新规则之前有一个L标志。 L标志使其成为最后处理的规则,因此永远不会触发新的RewriteRule,将其移动到RewriteBase之后。

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /

RewriteRule ^/Wordpress/(.*)$ http://example.com/wordpress/$1 [R=301,L]

RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

</IfModule>

# END WordPress

最后我不太明白(但可能是因为你创建了一个虚构的例子)是如果你移动了Wordpress目录,你将看不到你的Wordpress .htaccess文件中的重定向,因为请求如果它被移动,旧路径将不会命中该文件。