在Apache 2.4上使用Joomla重新启动后重定向旧URL

时间:2017-09-21 11:46:31

标签: apache .htaccess mod-rewrite joomla

这或多或少是关于在Apache上重定向[301]的问题,但是为Joomla CMS制定了一些其他必需的规则。

我们重新推出了Joomla 3网站。旧网站是其他CMS。 现在我们想将旧网址[301]重定向到新位置。

问题似乎是这不起作用。 我想有一个适合我们所有情况的解决方案(差不多300个)。

以下是我们要重定向的一些示例(old => new):

/index.php?CID=1 => /
/index.php?CID=2&Kat=1$ => /
/index.php?CID=3&Kat=2&PID=100 => /new/path
/old/path/file.extention => /new/file/path
/old/page.html => /new/page
/show_image.php?image=123456.jpg&text=Very%20Long%TEXT => /new/path/location
/show_image.php?image=654321.jpg&text=Very%20Long%TEXT => /other/path/location

我已经尝试了一些RewriteRules,如:

RewriteRule ^/index\.php\?CID=1$ http://%{HTTP_HOST}/ [R=301,L]

OR

RedirectMatch 301 ^/index\.php\?CID=1$ /

对于某些网址,RedirectMatch版本可以正常工作,但对于大多数网址都没有,特别是并非所有使用/index.php的网址,我都认为这是因为这是Joomla的入口点。

有没有办法重定向具体的网址,包括在Joomla RewriteRule变为活动状态之前用/index.php启动一次?

RewriteEngine启用并使用Joomla附带的默认htaccess:启用了SEF URL和URL-Rewrite。

请给我一些正确方向的暗示。 THX

如果你不知道,这是默认的Joomla .htaccess配置:

<IfModule autoindex>
  IndexIgnore *
</IfModule>

Options +FollowSymlinks
Options -Indexes

RewriteEngine On

RewriteCond %{QUERY_STRING} base64_encode[^(]*\([^)]*\) [OR]
RewriteCond %{QUERY_STRING} (<|%3C)([^s]*s)+cript.*(>|%3E) [NC,OR]
RewriteCond %{QUERY_STRING} GLOBALS(=|\[|\%[0-9A-Z]{0,2}) [OR]
RewriteCond %{QUERY_STRING} _REQUEST(=|\[|\%[0-9A-Z]{0,2})
RewriteRule .* index.php [F]

RewriteBase /
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteCond %{REQUEST_URI} !^/index\.php
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .* index.php [L]

1 个答案:

答案 0 :(得分:0)

同时我自己找到了解决方案,我想在这里与你分享。

所以这里的主要问题是,如果您想使用查询字符串重定向URL,则无法使用Redirect或RedirectMatch。 您必须使用具有查询字符串重写条件的重写规则,没有办法解决它。 这意味着你最终会得到一些URL(不是我希望的)至少两行,对于没有任何查询字符串的URL,它将在一行内工作。

以下是给定示例的一些解决方案:

/index.php?CID=1 => /
/index.php?CID=2&Kat=1$ => /

因为只有查询字符串不同但文件/路径(index.php)和目标(/)相同,我们可以将重写条件与OR标志连接起来:

RewriteCond %{QUERY_STRING} ^CID=29$ [OR]
RewriteCond %{QUERY_STRING} ^CID=2&Kat=1$
RewriteRule ^index\.php$ /? [R=301,L]

这里的无力是最后一行中的。如果您只将 / 添加到目标,则apache将重定向到例如 /?CID = 29 ,而不仅仅是 /

对于具有查询字符串的任何其他示例,您必须非常相似

/index.php?CID=3&Kat=2&PID=100 => /new/path
/show_image.php?image=123456.jpg&text=Very%20Long%TEXT => /new/path/location
/show_image.php?image=654321.jpg&text=Very%20Long%TEXT => /other/path/location

这些解决如下:

RewriteCond %{QUERY_STRING} ^CID=3&Kat=2&PID=100$
RewriteRule ^index\.php$ /new/path? [R=301,L]

RewriteCond %{QUERY_STRING} ^image=123456\.jpg&text=Very%20Long%TEXT$
RewriteRule ^show_image\.php$ /new/path/location? [R=301,L]

RewriteCond %{QUERY_STRING} ^image=654321\.jpg&text=Very%20Long%TEXT$
RewriteRule ^show_image\.php$ /other/path/location? [R=301,L]

请注意,您还必须在最后添加

对于没有查询字符串的所有示例,这照常工作。 这里有一些我提到的例子:

/old/path/file.extention => /new/file/path
/old/page.html => /new/page

我们只是像这样重定向:

RewriteRule ^old/path/file\.extention$ /new/file/path [R=301,L]
RewriteRule ^old/page\.html$ /new/page [R=301,L]

其他一些评论:

因为重写规则模式(原始文件/路径)或重写条件模式(在本例中为查询字符串)始终被解释为正则表达式,其中doth表示&#34;任何字符&#34;我总是把它放在它前面,所以我真的只匹配正确的文件或查询字符串而不是像#34; index-php&#34;这样的类似文件。或&#34; index7php&#34;等等 如果您有其他RegEx特定字符(例如+或*),您应该这样做。

我还有一些重写规则模式,其中原始URL包含一些空格,这将导致500错误,但可以通过将重写规则模式用双引号括起来非常简单。

这将在Apache 2.4下运行。我希望它可以提供帮助!

对于你们所有人来说,如何将它放入Joomla附带的.htaccess文件中,你应该把它放在RewriteBase /之前 这是自定义重定向应该是

的地方