将具有特定模式的URL重定向到子网站中的相同URL

时间:2017-04-26 09:39:13

标签: .htaccess url-rewriting url-redirection

更新:借助答案,我可以进行此更新。我想在我的.htaccess中使用以下表达式来工作。 (.htaccess的完整脚本也有问题)

    RewriteCond %{REQUEST_URI} ((mypage2(/\d{4}-\d{2}-\d{2})?/\d{1,2}) |about-us)
    RewriteRule ^(.+)$ /subsite/#/$1 [R=301,NC]

问题详情:

  1. 我已将angularjs子网站添加到现有的expressionengine php网站。
  2. 子网站只包含三个页面,现有网站的速度非常慢
  3. 我希望htacces将这三个网址重定向到新的子网站网址,例如mydomain / page2 / parameter1 / parameter2到mydomain / subsite /#/ page2 / parameter1 / parameter2和mydomain / page2 / parameter1到mydomain / subsite /# /第2页/参数1

  4. (这不是强制性的)在子网站中我想使用history push state来清理/操作网址以向用户显示 mydomain / page2 / parameter1 / parameter2 instaed of mydomain / subsite /#/ page2 / parameter1 / parameter2

  5. 我的.htaccess就像

        RewriteEngine On
        RewriteBase /
    
        # Removes index.php from ExpressionEngine URLs
        RewriteCond %{THE_REQUEST} ^GET.*index\.php [NC]
        RewriteCond %{REQUEST_URI} !/system/.* [NC]
        RewriteRule (.*?)index\.php/*(.*) /$1$2 [R=301,NE,L]
    
        RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
        RewriteRule ^(.*)$ http://%1/$1 [R=301,L]
    
        # Directs all EE web requests through the site index file
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteCond %{REQUEST_FILENAME} !-d       
        RewriteRule ^(.*)$ /index.php?/#/$1 [L,QSA]
    

    以下是我最想要的东西

        RewriteCond %{REQUEST_URI} ((mypage2(/\d{4}-\d{2}-\d{2})?/\d{1,2}) |about-us)
        RewriteRule ^(.+)$ /subsite/#/$1 [R=301,NC] ==> when url is like mypage2(/date optional)/pagenumber then redirect it to subsite/#/mypage2(/date optional)/pagenumber
    

    这是可选的,如果没有实现以下我可以活着

    在我的routing.js中,我想操纵像

    这样的网址
       $rootScope.$on('$stateChangeSuccess', function (event, toState, toParams,
     fromState, fromParams, options, Data) { 
         var cleanUrl = window.location.toString().replace(subsite+'/#/', '');           
        window.history.pushState(null, null, cleanUrl);
        //alert("Yes this works, it shows me the required url in browser at this moment");
       //Here I am trying to clean the url
       //But after that it reloads, some unwanted redirection happens after it
    });
    

6 个答案:

答案 0 :(得分:2)

好的,请尝试以下规则,

RewriteEngine On
RewriteCond %{REQUEST_URI} ^!(aSpecialString2|aSpecialString1|/)
RewriteRule ^(.+)$ /#/$1 [R=301,NC]

此处您不会在网址中获得#/uri,但您会获得%23 html实体,该实体会在网址中与#一样回复,您的应用就可以正常运行。

而且我假设你会用角度来解决这个问题。

答案 1 :(得分:1)

您可以在服务器端使用mod_rewrite和php来完成此任务

创建index.php

<?php
    if ( !empty($_GET['id']) ) {
      $protocol = 'http://';    
      if (!empty($_SERVER['HTTPS']) && ('on' == $_SERVER['HTTPS'])) {
         $protocol = 'https://';
      } 
      header('Location:' . $protocol . $_SERVER["HTTP_HOST"]. '/#/' . $_GET[id]);
      exit();
    }
?>
You html here

在.htaccess

中添加以下内容
RewriteEngine On
RewriteBase /
RewriteRule "index.php"  - [L]
RewriteRule "^(.*)$"  "index.php?id=$1"

要绕过某些网址aString1aString2,您可以使用:

RewriteEngine On
RewriteBase /
RewriteRule "index.php"  - [L]

RewriteCond %{REQUEST_URI} !^(aString1) 
RewriteCond %{REQUEST_URI} !^(aString2) 
RewriteRule "^(.*)$"  "index.php?id=$1"

要绕过您可以使用的资产:

RewriteEngine On
RewriteBase /
RewriteRule "index.php"  - [L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule "^(.*)$"  "index.php?id=$1"

现在,http://example.com/s1/s2将重定向到http://example.com/#/s1/s2

答案 2 :(得分:0)

您可以在客户端使用mod_rewrite和javascript片段进行此任务

将以下内容添加到.htaccess

RewriteEngine On
RewriteBase /
RewriteRule "^([^?#].*)$"  "/?$1" [R=301,NC]

将以下内容添加到主html

  <script>
  window.onload = function() {  
    location.hash = '/' + location.search.substr(1)  
  }
  </script>

现在,http://example.com/?s1/s2#/s1/s2将重定向到https://github.com/nicolas-albert/TestGit

答案 3 :(得分:0)

如果您可以访问服务器上的.htaccess,则可以修改它以使用代码中的URL而不插入#。

实际上有2个部分,一个在Angularjs应用程序中启用HTML5Mode,另一个在服务器上编辑.htaccess文件以成功处理此问题。

我根本不使用PHP,但是能够在本文后的几个网站上使用它:https://ngmilk.rocks/2015/03/09/angularjs-html5-mode-or-pretty-urls-on-apache-using-htaccess/#thecode

答案 4 :(得分:0)

  

访问页面后,我可以轻松清理网址,不显示哈希值,所以   我需要在网址中包含哈希,而用户没有提供网址   散列

为什么你认为用户会从网址中删除哈希值?没有理由这样做。角度路由基于url-hashes,否则用户每次访问不同的URL时都会重新呈现完整的应用视图。那么它不是SinglePageApp。 例如,PHP应用程序基于oquery字符串。如果你删除&#34;?product_id = 11&#34;从网址,然后您的路由将无法正常工作。 哈希也是如此。不要碰他们,他们在这里是有原因的。

答案 5 :(得分:0)

试试这个:

user1@gmail.com;user2@gmail.com;user3@gmail.com

注意第一条规则的评论。

您可以在以下网站中试用您的规则:http://htaccess.mwl.be/