【问题标题】:Set urls for redirect to a specific url without rewrite设置 url 以重定向到特定 url 而无需重写
【发布时间】:2017-01-20 12:14:17
【问题描述】:

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

所以基本上当用户从我这里购买许可证时,我会在我的网络服务器上创建一个自定义 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

我想知道是否可以将所有自定义 url 指向http://webserver/scheduler,而无需在浏览器中重写 url,例如当用户转到http://webserver/foo.scheduler.com/login 时,true 是http://webserver/scheduler/login,但用户仍然继续看http://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]

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

【问题讨论】:

  • 您有*.scheduler.com 的通配符 SSL 证书吗?

标签: apache .htaccess mod-rewrite


【解决方案1】:

很高兴为您提供帮助。

为 *.scheduler.com 获取有效的 SSL 证书。如果你要让它发挥作用,你将需要它。您确定要使用 HTTPS 吗?您的其他 URL 不是 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 的情况下执行此操作,请将以下内容添加到您的“000-default.conf”中,在当前存在的内容之后:

<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 工作并为/scheduler 服务,请将其添加到已经存在的VirtualHost。不是上面新加的,上面是原来的。

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

如果有任何问题,请告诉我。如果您希望将其放在您的 .htaccess 中,则需要对其进行更新。

【讨论】:

  • 您好,感谢您的回答。我正在我的树莓 LAMP 网络服务器上构建应用程序,所以我没有任何 ssl 证书。如果可能的话,不用ssl吗?有关其他详细信息,请在此处查看我的 pastebin:pastebin.com/dLX9jynk
  • 是的,这只是意味着你不能使用 https://,我更新了我的答案,说明了如何使它工作。
  • 我更新了000-default.conf,但无法正常工作。我已经在我的树莓上重新启动了服务 apache2,所以我在浏览器中输入这个 url:http://webserver/foo.scheduler.com 但我得到:404 而不是应用程序scheduler 文件夹
  • 你为什么要输入这个?这是给http://foo.scheduler.com/http://webserver/foo.scheduler.com 有什么意义?也可能只是http://webserver/foo 主机名仅与 URL 的第一部分相关。
  • '因为http://webserver/ 是我所有php项目所在的网络服务器的根目录,我需要通过输入以下网址访问http://webserver/scheduler/http//webserver/foo.scheduler.com/,这将在@中显示应用程序987654337@文件夹,无需将浏览器中的url更改为http://webserver/scheduler
【解决方案2】:

注意:我从字面上理解您的说法,即应用程序正在使用 http:// 并且客户端将使用 https:// URL。此外,我假设客户端访问的服务器与托管应用程序的服务器相同。


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

所以假设您的应用程序位于/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>

【讨论】:

    猜你喜欢
    • 2013-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-29
    • 2013-01-17
    • 2018-11-11
    相关资源
    最近更新 更多