1

Stack Exchange 上有许多与 mod_rewrite 和 mod_alias 的 Apache 配置相关的问题,但我找不到我的问题的答案,所以这是另一个问题!;)

我将旧网站迁移到新位置。

文章过去可以通过 URL 访问,例如http://xxx/blog/index.php?post/YYYY/MM/DD/title,因此通过现有网页有许多这种形式的链接。

现在,该 URL 应该是http://xxx/post/YYYY/MM/DD/title,所以只需blog/index.php?从最终 URL 中删除。

我想使用 mod_alias 和一个子句,但我在这里Redirect读到该子句是在该子句之后解释的,这对我来说是个问题,因为我已经在使用一个条件。RedirectRewriteRuleRewriteRule

这是我当前的 .htaccess 文件:

RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?$1

我试图以这种方式修改它:

RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^blog/index.php? / [R=301,L]
RewriteRule ^(.*)$ index.php?$1

它几乎可以工作,除了:

  1. http://xxx/blog/index.php?post/YYYY/MM/DD/title被重定向/重写到http://xxx/blog/?post/YYYY/MM/DD/title(注意?)所以它不起作用
  2. 看起来这个新行搞乱了很多其他不以 /blog/index.php 开头的 URL?比如后端网址...

任何帮助都将受到欢迎!

编辑(2014-07-16):

如果我使用以下规则:

RewriteRule ^/?blog/index\.php(.*)$ /$1 [R=301,L]

然后去 http://xxx/blog/index.php?test 带我去 http://xxx/?test 哪个几乎是正确的(问号仍然是一个问题)!

但是当我尝试通过添加来匹配询问标记时\?

RewriteRule ^/?blog/index\.php\?(.*)$ /$1 [R=301,L]

然后它就停止工作了……去那里: http://xxx/blog/index.php?test 把我留在那儿!

这是为什么?

4

1 回答 1

0

尝试将此规则添加到规则集的开头:

RewriteCond %{THE_REQUEST} \?post/([0-9]{4})/([0-9]{2})/([0-9]{2})/([^&\ ]*)
RewriteRule ^index\.php$ /post/%1/%2/%3/%4? [L,R=301]

使它看起来像:

RewriteEngine on
RewriteBase /

RewriteCond %{THE_REQUEST} \?post/([0-9]{4})/([0-9]{2})/([0-9]{2})/([^&\ ]*)
RewriteRule ^index\.php$ /post/%1/%2/%3/%4? [L,R=301]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?$1
于 2014-07-15T16:11:00.247 回答