Apache中的URL重定向问题(mod_rewrite / mod_alias)

时间:2014-07-15 15:55:54

标签: php apache .htaccess mod-rewrite mod-alias

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

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

以前可以访问http://xxx/blog/index.php?post/YYYY/MM/DD/title等网址的文章,因此该表单中有许多链接通过现有网页。

现在,网址应为http://xxx/post/YYYY/MM/DD/title,因此请从最终网址中删除blog/index.php?

我想使用mod_alias和Redirect子句,但我读here Redirect子句是在RewriteRule子句之后解释的,这是我的问题因为我已经使用了RewriteRule条件。

这是我当前的.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 ......
  3. 欢迎任何帮助!

    编辑(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 把我留在那儿!

    为什么?

1 个答案:

答案 0 :(得分: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