设置网址以重定向到特定网址而不重写

时间:2017-01-20 12:14:18

标签: apache .htaccess mod-rewrite

我正在构建一个具有多租户结构的webscheduler,我正在尝试做的是为每个买家分配一个指向我的应用程序的自定义URL。

所以基本上当用户从我那里购买许可证时,我会在我的网络服务器上创建一个自定义网址,如下所示:

http://webserver/foo.scheduler.com/login

其中foo是购买许可证的用户的名称,而scheduler是网址的默认部分,另一个例子包含更多买家:

http://webserver/foo.scheduler.com/login
http://webserver/foo2.scheduler.com/login
http://webserver/foo3.scheduler.com/login

基本上有三个买家(我的客户),每个自定义端点允许我识别正确的数据库凭证,因为在我的逻辑中每个租户都有一个特定的数据库,以便进行更多的数据组织。

实际上我的应用程序位于此端点:

http://webserver/scheduler

我想知道是否可以将所有自定义网址指向http://webserver/scheduler,而无需重写浏览器中的网址,例如当用户转到http://webserver/foo.scheduler.com/login时,其中http://webserver/scheduler/loginhttp://webserver/foo.scheduler.com/login },但用户仍然会看到.htaccess

怎么办呢?在我的RewriteEngine On RewriteBase /webscheduler/ RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-l RewriteRule ^(.+)$ index.php?url=$1 [QSA,L] 中,可以在应用程序文件夹的根目录中找到我的内容:

... onCreateView{
.....
notiList.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
    setListMultiSelectListener();
}


public void setListMultiSelectListener() {
    notiList.setMultiChoiceModeListener(new MultiChoiceModeListener() {

        @Override
        public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
            return false;
        }

        @Override
        public void onDestroyActionMode(ActionMode mode) {
            // clear your list selection here
            mAdapter.clearSelection();
        }

        @Override
        public boolean onCreateActionMode(final ActionMode mode, Menu menu) {
   // inflate your action menu here
            MenuInflater inflater = mode.getMenuInflater();
            inflater.inflate(R.menu.delete_mode_menu, menu);
            return true;
        }

        @Override
        public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
            int id = item.getItemId();
            switch (id) {
            case R.id.action_select_all:
                if (mAdapter.isAllSelected()) {
                    mAdapter.clearSelection();
                    for (int i = 0; i < notiList.getAdapter().getCount(); i++) {
                        notiList.setItemChecked(i, false);
                    }
                } else {
                    mAdapter.selectAllItems();
                    for (int i = 0; i < notiList.getAdapter().getCount(); i++) {
                        notiList.setItemChecked(i, true);
                    }
                }
                break;
            case R.id.action_delete:
                mAdapter.deleteSelectedItems();
                mode.finish();
                break;
            }
            return true;
        }

        @Override
        public void onItemCheckedStateChanged(ActionMode mode, int position, long id, boolean checked) {
            deletionMode = mode;
            if (checked) {
                nr = nr + 1;
                mAdapter.setNewSelection(position, checked);
            } else {
                nr = nr - 1;
                mAdapter.removeSelection(position);
            }
            if (mAdapter.isAllSelected()) {
                mode.getMenu().findItem(R.id.action_select_all).setIcon(R.drawable.check);
            } else {
                mode.getMenu().findItem(R.id.action_select_all).setIcon(R.drawable.uncheck);
            }
        }
    });
}

这允许我重写索引的基本路径,并将跟踪分流到特定的控制器。

2 个答案:

答案 0 :(得分:3)

很高兴为您提供帮助。

获取* .scheduler.com的有效SSL证书。如果您打算让它发挥作用,您将需要这样做。您确定要使用HTTPS吗?您的其他网址不是HTTPS。然后,您需要为* .scheduler.com设置虚拟主机才能正常使用该证书。 Only having

<VirtualHost *:443>
    ServerAlias *.scheduler.com
    DocumentRoot "/var/www/html/progetti/scheduler"
</VirtualHost>

不会有足够的东西。您需要在其中设置所有mod_ssl内容,就像在其他虚拟主机上一样。您可以使用该默认HTTPS主机,而不是添加另一个,并进行修改。

首先要做的是让您的托管服务适用于https://*.scheduler.com/,然后将其指向正确的位置。

您的端点是http://webserver/scheduler是什么意思?这不是有效的域名。请澄清你的意思,我会更新我的答案更多信息。代码是否在同一台服务器上?

-

<强>更新

所以要在没有SSL的情况下执行此操作,请将以下内容添加到&#34; 000-default.conf&#34;,在当前的位置之后:

<VirtualHost *:80>
    ServerAdmin localhost@gmail.com
    ServerName www.scheduler.com
    ServerAlias *.scheduler.com
    UseCanonicalName off
    DocumentRoot /var/www/html/progetti/scheduler
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

    <Directory /var/www/html/progetti/scheduler>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride All
        Order allow,deny
        Allow from all
    </Directory>
</VirtualHost>

-

<强>更新

要使http://webserver/foo.scheduler.com工作并提供/调度程序,请将其添加到已存在的VirtualHost中。不是上面添加的新版本,原版版本位于顶部。

RewriteEngine on
RewriteRule ^(/[^./]+\.scheduler\.com)(?:$|/(.*)$) /scheduler/$2

让我知道任何问题。如果您希望将它放在.htaccess中,则需要更新。

答案 1 :(得分:1)

注意:我从字面上理解您的应用正在使用http://的语句,客户端将使用https://个网址。此外,我假设客户端与托管应用程序的服务器位于同一服务器上。

最简单的方法可能是为您的实际应用程序配置一个VirtualHost,为其他URL配置一个VirtualHost。

因此假设您的应用程序位于/var/www/html/scheduler,那么您现有的VirtualHost似乎是:

<VirtualHost *:80>
   ServerName webserver
   DocumentRoot "/var/www/html"
</VirtualHost>

您需要在conf.d/ssl.conf添加更改,以便具有以下内容:

NameVirtualHost *:443

<VirtualHost *:443>
    ServerAlias *.scheduler.com
    DocumentRoot "/var/www/html/scheduler"
</VirtualHost>