feat: improve multiple domain support - #6759

Closed
kenjis wants to merge 17 commits into
codeigniter4:4.3from
kenjis:improve-subdomain-support
Closed

feat: improve multiple domain support#6759
kenjis wants to merge 17 commits into
codeigniter4:4.3from
kenjis:improve-subdomain-support

Conversation

@kenjis

@kenjiskenjis commented Oct 26, 2022

Copy link
Copy Markdown
Member

Description
Fixes#5807
Related #6746

  • add Config\App::$allowedHostnames
  • update Config\App::$baseURL in IncomingRequest if HTTP_HOST is an allowed hostname

Changes:

  • current_url(), base_url(), site_url() will return the URL with allowed HTTP_HOST
  • previous_url() will return the site URL with allowed HTTP_HOST when cannot get it from session nor HTTP_REFERER

The following functions/methods are affected (There may be others):

  • Using site_url()
    • form_open()
    • audio()
    • embed()
    • img()
    • link_tag()
    • object()
    • script_tag()
    • source()
    • video()
    • RedirectResponse::route()
    • RedirectResponse::to()
    • Toolbar::prepare()
    • Toolbar::respond()
    • anchor()
    • anchor_popup()
    • base_url()
    • previous_url()
    • url_to()
  • Using base_url()
    • RedirectException in CodeIgnter.php L377
    • UserAgent::isReferral()
  • Using current_url()
    • ChromeLoggerHandler::__construct()
    • CodeIgniter::storePreviousURL()
    • Pager::ensureGroup()
    • Toolbar::run()

Ref #4651

Checklist:

  • Securely signed commits
  • Component(s) with PHPDoc blocks, only if necessary or adds value
  • Unit testing, with >80% coverage
  • User guide updated
  • Conforms to style guide

@kenjiskenjis added enhancement PRs that improve existing functionalities 4.3 labels Oct 26, 2022
protected function detectURI(string $protocol, string $baseURL)
{
// Passing the config is unnecessary but left for legacy purposes
// @TODO For what? Why clone?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The clone prevents URI testing from changing the App Config globally.

@kenjiskenjisOct 27, 2022

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The reason for clone is only for testing, I would like to remove it.

--- a/system/HTTP/IncomingRequest.php+++ b/system/HTTP/IncomingRequest.php@@ -195,12 +195,7 @@ class IncomingRequest extends Request
*/
protected function detectURI(string $protocol, string $baseURL)
{
- // Passing the config is unnecessary but left for legacy purposes- // @TODO For what? Why clone?- $config = clone $this->config;- $config->baseURL = $baseURL;-- $this->setPath($this->detectPath($protocol), $config);+ $this->setPath($this->detectPath($this->config->uriProtocol), $this->config);
}
/**

@MGatnerMGatnerOct 27, 2022

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

And deprecate the baseURL input? Is that really only for testing?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Both $protocol and $baseURL of detectURI() are not needed.

__construct():

$this->detectURI($config->uriProtocol, $config->baseURL);

protectedfunctiondetectURI(string$protocol, string$baseURL)
{
// Passing the config is unnecessary but left for legacy purposes
$config = clone$this->config;
$config->baseURL = $baseURL;
$this->setPath($this->detectPath($protocol), $config);
}

@michalsnmichalsn left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This may be very useful feature.

At some point we probably should consider providing some easy function (helper) to generate a URL to a different host than this defined in baseURL.

Comment threadsystem/HTTP/IncomingRequest.php
Comment threadsystem/HTTP/IncomingRequest.php Outdated
@kenjis
kenjisforce-pushed the improve-subdomain-support branch from b984b8f to 52a8589CompareOctober 27, 2022 04:53
@kenjis
kenjisforce-pushed the improve-subdomain-support branch from 52a8589 to b6e0976CompareOctober 27, 2022 05:08
@kenjis

Copy link
Copy Markdown
MemberAuthor

Is this a breaking change?

@MGatnerMGatner left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this is mostly okay. I want to hear more about the write-back to App Config - that seems like a pretty big possibility for issues to creep in, and ones that would be difficult to trace. As far as I can tell the logic here is all self-contained, and since current_url() uses this class we shouldn't need to touch the Config.


if ($config->baseURL === '') {
// @codeCoverageIgnoreStart
exit('You have an empty or invalid base URL. The baseURL value must be set in Config\App.php, or through the .env file.');

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This used to be conditional on !is_cli() - what is the justification or precedent for requiring CLI to have this set?

Comment on lines +420 to +423
// Update Config\App::$baseURL
$uri = new URI($baseURL);
$uri->setHost($host);
$this->config->baseURL = $uri;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I really don't like components updating global Config values. This seems like a bad idea. What does this fix?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Without this, all helpers will return "old" URLs, not one of those defined in allowedHostnames. That's basically the whole point of all these changes.

I have an app where subdomains and custom domains are used, but I use a more dynamic approach and handle it via Registrars. I would recommend this way, but the only downside is that we can't make it work with one config variable - it's a bit more complicated.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We need the current real baseURL with allowedHostnames in somewhere.
I think Config\App::$baseURL in shared Config object is best,
because the baseURL is only one in a request and never changes. I don't see any problems.

But if something wrong that I miss, we need to save the current baseURL somewhere else.
Where?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would rather see anything that needs to rely on "URL for the incoming request" to use a component that represents that (IncomingRequest, current_url(), etc). It seems very counterintuitive that our Config values are dependent on infrastructure context.

I get that this is the most straightforward approach to a fix, but I think it pokes a new hole in our architecture that is liable to leak, grow bigger, etc.

I'm not a fan of the proliferation of global URL helpers we already have but I would prefer something like current_base_url() to this.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Re: Registrars... I think that is a great solution at the project level, and would encourage it for individuals who need this currently.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Indeed, it may seem counter-intuitive that the value of one Config object changes dynamically.
I think it is better that the URI object in IncomingRequest has all the URL related data including the current baseURL.

Comment threadsystem/HTTP/IncomingRequest.php
@kenjis

Copy link
Copy Markdown
MemberAuthor

Go to #6785

@kenjiskenjis closed this Oct 29, 2022
@kenjis
kenjis deleted the improve-subdomain-support branch October 29, 2022 23:23
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancementPRs that improve existing functionalities

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@kenjis@michalsn@MGatner
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

feat: improve multiple domain support - #6759

Closed
kenjis wants to merge 17 commits into
codeigniter4:4.3from
kenjis:improve-subdomain-support
Closed

feat: improve multiple domain support#6759
kenjis wants to merge 17 commits into
codeigniter4:4.3from
kenjis:improve-subdomain-support

Conversation

@kenjis

@kenjiskenjis commented Oct 26, 2022

Copy link
Copy Markdown
Member

Description
Fixes#5807
Related #6746

  • add Config\App::$allowedHostnames
  • update Config\App::$baseURL in IncomingRequest if HTTP_HOST is an allowed hostname

Changes:

  • current_url(), base_url(), site_url() will return the URL with allowed HTTP_HOST
  • previous_url() will return the site URL with allowed HTTP_HOST when cannot get it from session nor HTTP_REFERER

The following functions/methods are affected (There may be others):

  • Using site_url()
    • form_open()
    • audio()
    • embed()
    • img()
    • link_tag()
    • object()
    • script_tag()
    • source()
    • video()
    • RedirectResponse::route()
    • RedirectResponse::to()
    • Toolbar::prepare()
    • Toolbar::respond()
    • anchor()
    • anchor_popup()
    • base_url()
    • previous_url()
    • url_to()
  • Using base_url()
    • RedirectException in CodeIgnter.php L377
    • UserAgent::isReferral()
  • Using current_url()
    • ChromeLoggerHandler::__construct()
    • CodeIgniter::storePreviousURL()
    • Pager::ensureGroup()
    • Toolbar::run()

Ref #4651

Checklist:

  • Securely signed commits
  • Component(s) with PHPDoc blocks, only if necessary or adds value
  • Unit testing, with >80% coverage
  • User guide updated
  • Conforms to style guide

@kenjiskenjis added enhancement PRs that improve existing functionalities 4.3 labels Oct 26, 2022
protected function detectURI(string $protocol, string $baseURL)
{
// Passing the config is unnecessary but left for legacy purposes
// @TODO For what? Why clone?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The clone prevents URI testing from changing the App Config globally.

@kenjiskenjisOct 27, 2022

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The reason for clone is only for testing, I would like to remove it.

--- a/system/HTTP/IncomingRequest.php+++ b/system/HTTP/IncomingRequest.php@@ -195,12 +195,7 @@ class IncomingRequest extends Request
*/
protected function detectURI(string $protocol, string $baseURL)
{
- // Passing the config is unnecessary but left for legacy purposes- // @TODO For what? Why clone?- $config = clone $this->config;- $config->baseURL = $baseURL;-- $this->setPath($this->detectPath($protocol), $config);+ $this->setPath($this->detectPath($this->config->uriProtocol), $this->config);
}
/**

@MGatnerMGatnerOct 27, 2022

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

And deprecate the baseURL input? Is that really only for testing?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Both $protocol and $baseURL of detectURI() are not needed.

__construct():

$this->detectURI($config->uriProtocol, $config->baseURL);

protectedfunctiondetectURI(string$protocol, string$baseURL)
{
// Passing the config is unnecessary but left for legacy purposes
$config = clone$this->config;
$config->baseURL = $baseURL;
$this->setPath($this->detectPath($protocol), $config);
}

@michalsnmichalsn left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This may be very useful feature.

At some point we probably should consider providing some easy function (helper) to generate a URL to a different host than this defined in baseURL.

Comment threadsystem/HTTP/IncomingRequest.php
Comment threadsystem/HTTP/IncomingRequest.php Outdated
@kenjis
kenjisforce-pushed the improve-subdomain-support branch from b984b8f to 52a8589CompareOctober 27, 2022 04:53
@kenjis
kenjisforce-pushed the improve-subdomain-support branch from 52a8589 to b6e0976CompareOctober 27, 2022 05:08
@kenjis

Copy link
Copy Markdown
MemberAuthor

Is this a breaking change?

@MGatnerMGatner left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this is mostly okay. I want to hear more about the write-back to App Config - that seems like a pretty big possibility for issues to creep in, and ones that would be difficult to trace. As far as I can tell the logic here is all self-contained, and since current_url() uses this class we shouldn't need to touch the Config.


if ($config->baseURL === '') {
// @codeCoverageIgnoreStart
exit('You have an empty or invalid base URL. The baseURL value must be set in Config\App.php, or through the .env file.');

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This used to be conditional on !is_cli() - what is the justification or precedent for requiring CLI to have this set?

Comment on lines +420 to +423
// Update Config\App::$baseURL
$uri = new URI($baseURL);
$uri->setHost($host);
$this->config->baseURL = $uri;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I really don't like components updating global Config values. This seems like a bad idea. What does this fix?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Without this, all helpers will return "old" URLs, not one of those defined in allowedHostnames. That's basically the whole point of all these changes.

I have an app where subdomains and custom domains are used, but I use a more dynamic approach and handle it via Registrars. I would recommend this way, but the only downside is that we can't make it work with one config variable - it's a bit more complicated.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We need the current real baseURL with allowedHostnames in somewhere.
I think Config\App::$baseURL in shared Config object is best,
because the baseURL is only one in a request and never changes. I don't see any problems.

But if something wrong that I miss, we need to save the current baseURL somewhere else.
Where?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would rather see anything that needs to rely on "URL for the incoming request" to use a component that represents that (IncomingRequest, current_url(), etc). It seems very counterintuitive that our Config values are dependent on infrastructure context.

I get that this is the most straightforward approach to a fix, but I think it pokes a new hole in our architecture that is liable to leak, grow bigger, etc.

I'm not a fan of the proliferation of global URL helpers we already have but I would prefer something like current_base_url() to this.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Re: Registrars... I think that is a great solution at the project level, and would encourage it for individuals who need this currently.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Indeed, it may seem counter-intuitive that the value of one Config object changes dynamically.
I think it is better that the URI object in IncomingRequest has all the URL related data including the current baseURL.

Comment threadsystem/HTTP/IncomingRequest.php
@kenjis

Copy link
Copy Markdown
MemberAuthor

Go to #6785

@kenjiskenjis closed this Oct 29, 2022
@kenjis
kenjis deleted the improve-subdomain-support branch October 29, 2022 23:23
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancementPRs that improve existing functionalities

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@kenjis@michalsn@MGatner
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat: improve multiple domain support - #6759

Closed
kenjis wants to merge 17 commits into
codeigniter4:4.3from
kenjis:improve-subdomain-support
Closed

feat: improve multiple domain support#6759
kenjis wants to merge 17 commits into
codeigniter4:4.3from
kenjis:improve-subdomain-support

Conversation

@kenjis

@kenjiskenjis commented Oct 26, 2022

Copy link
Copy Markdown
Member

Description
Fixes#5807
Related #6746

  • add Config\App::$allowedHostnames
  • update Config\App::$baseURL in IncomingRequest if HTTP_HOST is an allowed hostname

Changes:

  • current_url(), base_url(), site_url() will return the URL with allowed HTTP_HOST
  • previous_url() will return the site URL with allowed HTTP_HOST when cannot get it from session nor HTTP_REFERER

The following functions/methods are affected (There may be others):

  • Using site_url()
    • form_open()
    • audio()
    • embed()
    • img()
    • link_tag()
    • object()
    • script_tag()
    • source()
    • video()
    • RedirectResponse::route()
    • RedirectResponse::to()
    • Toolbar::prepare()
    • Toolbar::respond()
    • anchor()
    • anchor_popup()
    • base_url()
    • previous_url()
    • url_to()
  • Using base_url()
    • RedirectException in CodeIgnter.php L377
    • UserAgent::isReferral()
  • Using current_url()
    • ChromeLoggerHandler::__construct()
    • CodeIgniter::storePreviousURL()
    • Pager::ensureGroup()
    • Toolbar::run()

Ref #4651

Checklist:

  • Securely signed commits
  • Component(s) with PHPDoc blocks, only if necessary or adds value
  • Unit testing, with >80% coverage
  • User guide updated
  • Conforms to style guide

@kenjiskenjis added enhancement PRs that improve existing functionalities 4.3 labels Oct 26, 2022
protected function detectURI(string $protocol, string $baseURL)
{
// Passing the config is unnecessary but left for legacy purposes
// @TODO For what? Why clone?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The clone prevents URI testing from changing the App Config globally.

@kenjiskenjisOct 27, 2022

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The reason for clone is only for testing, I would like to remove it.

--- a/system/HTTP/IncomingRequest.php+++ b/system/HTTP/IncomingRequest.php@@ -195,12 +195,7 @@ class IncomingRequest extends Request
*/
protected function detectURI(string $protocol, string $baseURL)
{
- // Passing the config is unnecessary but left for legacy purposes- // @TODO For what? Why clone?- $config = clone $this->config;- $config->baseURL = $baseURL;-- $this->setPath($this->detectPath($protocol), $config);+ $this->setPath($this->detectPath($this->config->uriProtocol), $this->config);
}
/**

@MGatnerMGatnerOct 27, 2022

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

And deprecate the baseURL input? Is that really only for testing?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Both $protocol and $baseURL of detectURI() are not needed.

__construct():

$this->detectURI($config->uriProtocol, $config->baseURL);

protectedfunctiondetectURI(string$protocol, string$baseURL)
{
// Passing the config is unnecessary but left for legacy purposes
$config = clone$this->config;
$config->baseURL = $baseURL;
$this->setPath($this->detectPath($protocol), $config);
}

@michalsnmichalsn left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This may be very useful feature.

At some point we probably should consider providing some easy function (helper) to generate a URL to a different host than this defined in baseURL.

Comment threadsystem/HTTP/IncomingRequest.php
Comment threadsystem/HTTP/IncomingRequest.php Outdated
@kenjis
kenjisforce-pushed the improve-subdomain-support branch from b984b8f to 52a8589CompareOctober 27, 2022 04:53
@kenjis
kenjisforce-pushed the improve-subdomain-support branch from 52a8589 to b6e0976CompareOctober 27, 2022 05:08
@kenjis

Copy link
Copy Markdown
MemberAuthor

Is this a breaking change?

@MGatnerMGatner left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this is mostly okay. I want to hear more about the write-back to App Config - that seems like a pretty big possibility for issues to creep in, and ones that would be difficult to trace. As far as I can tell the logic here is all self-contained, and since current_url() uses this class we shouldn't need to touch the Config.


if ($config->baseURL === '') {
// @codeCoverageIgnoreStart
exit('You have an empty or invalid base URL. The baseURL value must be set in Config\App.php, or through the .env file.');

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This used to be conditional on !is_cli() - what is the justification or precedent for requiring CLI to have this set?

Comment on lines +420 to +423
// Update Config\App::$baseURL
$uri = new URI($baseURL);
$uri->setHost($host);
$this->config->baseURL = $uri;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I really don't like components updating global Config values. This seems like a bad idea. What does this fix?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Without this, all helpers will return "old" URLs, not one of those defined in allowedHostnames. That's basically the whole point of all these changes.

I have an app where subdomains and custom domains are used, but I use a more dynamic approach and handle it via Registrars. I would recommend this way, but the only downside is that we can't make it work with one config variable - it's a bit more complicated.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We need the current real baseURL with allowedHostnames in somewhere.
I think Config\App::$baseURL in shared Config object is best,
because the baseURL is only one in a request and never changes. I don't see any problems.

But if something wrong that I miss, we need to save the current baseURL somewhere else.
Where?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would rather see anything that needs to rely on "URL for the incoming request" to use a component that represents that (IncomingRequest, current_url(), etc). It seems very counterintuitive that our Config values are dependent on infrastructure context.

I get that this is the most straightforward approach to a fix, but I think it pokes a new hole in our architecture that is liable to leak, grow bigger, etc.

I'm not a fan of the proliferation of global URL helpers we already have but I would prefer something like current_base_url() to this.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Re: Registrars... I think that is a great solution at the project level, and would encourage it for individuals who need this currently.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Indeed, it may seem counter-intuitive that the value of one Config object changes dynamically.
I think it is better that the URI object in IncomingRequest has all the URL related data including the current baseURL.

Comment threadsystem/HTTP/IncomingRequest.php
@kenjis

Copy link
Copy Markdown
MemberAuthor

Go to #6785

@kenjiskenjis closed this Oct 29, 2022
@kenjis
kenjis deleted the improve-subdomain-support branch October 29, 2022 23:23
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancementPRs that improve existing functionalities

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@kenjis@michalsn@MGatner
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat: improve multiple domain support - #6759

Closed
kenjis wants to merge 17 commits into
codeigniter4:4.3from
kenjis:improve-subdomain-support
Closed

feat: improve multiple domain support#6759
kenjis wants to merge 17 commits into
codeigniter4:4.3from
kenjis:improve-subdomain-support

Conversation

@kenjis

@kenjiskenjis commented Oct 26, 2022

Copy link
Copy Markdown
Member

Description
Fixes#5807
Related #6746

  • add Config\App::$allowedHostnames
  • update Config\App::$baseURL in IncomingRequest if HTTP_HOST is an allowed hostname

Changes:

  • current_url(), base_url(), site_url() will return the URL with allowed HTTP_HOST
  • previous_url() will return the site URL with allowed HTTP_HOST when cannot get it from session nor HTTP_REFERER

The following functions/methods are affected (There may be others):

  • Using site_url()
    • form_open()
    • audio()
    • embed()
    • img()
    • link_tag()
    • object()
    • script_tag()
    • source()
    • video()
    • RedirectResponse::route()
    • RedirectResponse::to()
    • Toolbar::prepare()
    • Toolbar::respond()
    • anchor()
    • anchor_popup()
    • base_url()
    • previous_url()
    • url_to()
  • Using base_url()
    • RedirectException in CodeIgnter.php L377
    • UserAgent::isReferral()
  • Using current_url()
    • ChromeLoggerHandler::__construct()
    • CodeIgniter::storePreviousURL()
    • Pager::ensureGroup()
    • Toolbar::run()

Ref #4651

Checklist:

  • Securely signed commits
  • Component(s) with PHPDoc blocks, only if necessary or adds value
  • Unit testing, with >80% coverage
  • User guide updated
  • Conforms to style guide

@kenjiskenjis added enhancement PRs that improve existing functionalities 4.3 labels Oct 26, 2022
protected function detectURI(string $protocol, string $baseURL)
{
// Passing the config is unnecessary but left for legacy purposes
// @TODO For what? Why clone?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The clone prevents URI testing from changing the App Config globally.

@kenjiskenjisOct 27, 2022

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The reason for clone is only for testing, I would like to remove it.

--- a/system/HTTP/IncomingRequest.php+++ b/system/HTTP/IncomingRequest.php@@ -195,12 +195,7 @@ class IncomingRequest extends Request
*/
protected function detectURI(string $protocol, string $baseURL)
{
- // Passing the config is unnecessary but left for legacy purposes- // @TODO For what? Why clone?- $config = clone $this->config;- $config->baseURL = $baseURL;-- $this->setPath($this->detectPath($protocol), $config);+ $this->setPath($this->detectPath($this->config->uriProtocol), $this->config);
}
/**

@MGatnerMGatnerOct 27, 2022

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

And deprecate the baseURL input? Is that really only for testing?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Both $protocol and $baseURL of detectURI() are not needed.

__construct():

$this->detectURI($config->uriProtocol, $config->baseURL);

protectedfunctiondetectURI(string$protocol, string$baseURL)
{
// Passing the config is unnecessary but left for legacy purposes
$config = clone$this->config;
$config->baseURL = $baseURL;
$this->setPath($this->detectPath($protocol), $config);
}

@michalsnmichalsn left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This may be very useful feature.

At some point we probably should consider providing some easy function (helper) to generate a URL to a different host than this defined in baseURL.

Comment threadsystem/HTTP/IncomingRequest.php
Comment threadsystem/HTTP/IncomingRequest.php Outdated
@kenjis
kenjisforce-pushed the improve-subdomain-support branch from b984b8f to 52a8589CompareOctober 27, 2022 04:53
@kenjis
kenjisforce-pushed the improve-subdomain-support branch from 52a8589 to b6e0976CompareOctober 27, 2022 05:08
@kenjis

Copy link
Copy Markdown
MemberAuthor

Is this a breaking change?

@MGatnerMGatner left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this is mostly okay. I want to hear more about the write-back to App Config - that seems like a pretty big possibility for issues to creep in, and ones that would be difficult to trace. As far as I can tell the logic here is all self-contained, and since current_url() uses this class we shouldn't need to touch the Config.


if ($config->baseURL === '') {
// @codeCoverageIgnoreStart
exit('You have an empty or invalid base URL. The baseURL value must be set in Config\App.php, or through the .env file.');

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This used to be conditional on !is_cli() - what is the justification or precedent for requiring CLI to have this set?

Comment on lines +420 to +423
// Update Config\App::$baseURL
$uri = new URI($baseURL);
$uri->setHost($host);
$this->config->baseURL = $uri;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I really don't like components updating global Config values. This seems like a bad idea. What does this fix?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Without this, all helpers will return "old" URLs, not one of those defined in allowedHostnames. That's basically the whole point of all these changes.

I have an app where subdomains and custom domains are used, but I use a more dynamic approach and handle it via Registrars. I would recommend this way, but the only downside is that we can't make it work with one config variable - it's a bit more complicated.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We need the current real baseURL with allowedHostnames in somewhere.
I think Config\App::$baseURL in shared Config object is best,
because the baseURL is only one in a request and never changes. I don't see any problems.

But if something wrong that I miss, we need to save the current baseURL somewhere else.
Where?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would rather see anything that needs to rely on "URL for the incoming request" to use a component that represents that (IncomingRequest, current_url(), etc). It seems very counterintuitive that our Config values are dependent on infrastructure context.

I get that this is the most straightforward approach to a fix, but I think it pokes a new hole in our architecture that is liable to leak, grow bigger, etc.

I'm not a fan of the proliferation of global URL helpers we already have but I would prefer something like current_base_url() to this.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Re: Registrars... I think that is a great solution at the project level, and would encourage it for individuals who need this currently.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Indeed, it may seem counter-intuitive that the value of one Config object changes dynamically.
I think it is better that the URI object in IncomingRequest has all the URL related data including the current baseURL.

Comment threadsystem/HTTP/IncomingRequest.php
@kenjis

Copy link
Copy Markdown
MemberAuthor

Go to #6785

@kenjiskenjis closed this Oct 29, 2022
@kenjis
kenjis deleted the improve-subdomain-support branch October 29, 2022 23:23
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancementPRs that improve existing functionalities

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@kenjis@michalsn@MGatner
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

feat: improve multiple domain support - #6759

Closed
kenjis wants to merge 17 commits into
codeigniter4:4.3from
kenjis:improve-subdomain-support
Closed

feat: improve multiple domain support#6759
kenjis wants to merge 17 commits into
codeigniter4:4.3from
kenjis:improve-subdomain-support

Conversation

@kenjis

@kenjiskenjis commented Oct 26, 2022

Copy link
Copy Markdown
Member

Description
Fixes#5807
Related #6746

  • add Config\App::$allowedHostnames
  • update Config\App::$baseURL in IncomingRequest if HTTP_HOST is an allowed hostname

Changes:

  • current_url(), base_url(), site_url() will return the URL with allowed HTTP_HOST
  • previous_url() will return the site URL with allowed HTTP_HOST when cannot get it from session nor HTTP_REFERER

The following functions/methods are affected (There may be others):

  • Using site_url()
    • form_open()
    • audio()
    • embed()
    • img()
    • link_tag()
    • object()
    • script_tag()
    • source()
    • video()
    • RedirectResponse::route()
    • RedirectResponse::to()
    • Toolbar::prepare()
    • Toolbar::respond()
    • anchor()
    • anchor_popup()
    • base_url()
    • previous_url()
    • url_to()
  • Using base_url()
    • RedirectException in CodeIgnter.php L377
    • UserAgent::isReferral()
  • Using current_url()
    • ChromeLoggerHandler::__construct()
    • CodeIgniter::storePreviousURL()
    • Pager::ensureGroup()
    • Toolbar::run()

Ref #4651

Checklist:

  • Securely signed commits
  • Component(s) with PHPDoc blocks, only if necessary or adds value
  • Unit testing, with >80% coverage
  • User guide updated
  • Conforms to style guide

@kenjiskenjis added enhancement PRs that improve existing functionalities 4.3 labels Oct 26, 2022
protected function detectURI(string $protocol, string $baseURL)
{
// Passing the config is unnecessary but left for legacy purposes
// @TODO For what? Why clone?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The clone prevents URI testing from changing the App Config globally.

@kenjiskenjisOct 27, 2022

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The reason for clone is only for testing, I would like to remove it.

--- a/system/HTTP/IncomingRequest.php+++ b/system/HTTP/IncomingRequest.php@@ -195,12 +195,7 @@ class IncomingRequest extends Request
*/
protected function detectURI(string $protocol, string $baseURL)
{
- // Passing the config is unnecessary but left for legacy purposes- // @TODO For what? Why clone?- $config = clone $this->config;- $config->baseURL = $baseURL;-- $this->setPath($this->detectPath($protocol), $config);+ $this->setPath($this->detectPath($this->config->uriProtocol), $this->config);
}
/**

@MGatnerMGatnerOct 27, 2022

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

And deprecate the baseURL input? Is that really only for testing?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Both $protocol and $baseURL of detectURI() are not needed.

__construct():

$this->detectURI($config->uriProtocol, $config->baseURL);

protectedfunctiondetectURI(string$protocol, string$baseURL)
{
// Passing the config is unnecessary but left for legacy purposes
$config = clone$this->config;
$config->baseURL = $baseURL;
$this->setPath($this->detectPath($protocol), $config);
}

@michalsnmichalsn left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This may be very useful feature.

At some point we probably should consider providing some easy function (helper) to generate a URL to a different host than this defined in baseURL.

Comment threadsystem/HTTP/IncomingRequest.php
Comment threadsystem/HTTP/IncomingRequest.php Outdated
@kenjis
kenjisforce-pushed the improve-subdomain-support branch from b984b8f to 52a8589CompareOctober 27, 2022 04:53
@kenjis
kenjisforce-pushed the improve-subdomain-support branch from 52a8589 to b6e0976CompareOctober 27, 2022 05:08
@kenjis

Copy link
Copy Markdown
MemberAuthor

Is this a breaking change?

@MGatnerMGatner left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this is mostly okay. I want to hear more about the write-back to App Config - that seems like a pretty big possibility for issues to creep in, and ones that would be difficult to trace. As far as I can tell the logic here is all self-contained, and since current_url() uses this class we shouldn't need to touch the Config.


if ($config->baseURL === '') {
// @codeCoverageIgnoreStart
exit('You have an empty or invalid base URL. The baseURL value must be set in Config\App.php, or through the .env file.');

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This used to be conditional on !is_cli() - what is the justification or precedent for requiring CLI to have this set?

Comment on lines +420 to +423
// Update Config\App::$baseURL
$uri = new URI($baseURL);
$uri->setHost($host);
$this->config->baseURL = $uri;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I really don't like components updating global Config values. This seems like a bad idea. What does this fix?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Without this, all helpers will return "old" URLs, not one of those defined in allowedHostnames. That's basically the whole point of all these changes.

I have an app where subdomains and custom domains are used, but I use a more dynamic approach and handle it via Registrars. I would recommend this way, but the only downside is that we can't make it work with one config variable - it's a bit more complicated.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We need the current real baseURL with allowedHostnames in somewhere.
I think Config\App::$baseURL in shared Config object is best,
because the baseURL is only one in a request and never changes. I don't see any problems.

But if something wrong that I miss, we need to save the current baseURL somewhere else.
Where?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would rather see anything that needs to rely on "URL for the incoming request" to use a component that represents that (IncomingRequest, current_url(), etc). It seems very counterintuitive that our Config values are dependent on infrastructure context.

I get that this is the most straightforward approach to a fix, but I think it pokes a new hole in our architecture that is liable to leak, grow bigger, etc.

I'm not a fan of the proliferation of global URL helpers we already have but I would prefer something like current_base_url() to this.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Re: Registrars... I think that is a great solution at the project level, and would encourage it for individuals who need this currently.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Indeed, it may seem counter-intuitive that the value of one Config object changes dynamically.
I think it is better that the URI object in IncomingRequest has all the URL related data including the current baseURL.

Comment threadsystem/HTTP/IncomingRequest.php
@kenjis

Copy link
Copy Markdown
MemberAuthor

Go to #6785

@kenjiskenjis closed this Oct 29, 2022
@kenjis
kenjis deleted the improve-subdomain-support branch October 29, 2022 23:23
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancementPRs that improve existing functionalities

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@kenjis@michalsn@MGatner
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat: improve multiple domain support - #6759

Closed
kenjis wants to merge 17 commits into
codeigniter4:4.3from
kenjis:improve-subdomain-support
Closed

feat: improve multiple domain support#6759
kenjis wants to merge 17 commits into
codeigniter4:4.3from
kenjis:improve-subdomain-support

Conversation

@kenjis

@kenjiskenjis commented Oct 26, 2022

Copy link
Copy Markdown
Member

Description
Fixes#5807
Related #6746

  • add Config\App::$allowedHostnames
  • update Config\App::$baseURL in IncomingRequest if HTTP_HOST is an allowed hostname

Changes:

  • current_url(), base_url(), site_url() will return the URL with allowed HTTP_HOST
  • previous_url() will return the site URL with allowed HTTP_HOST when cannot get it from session nor HTTP_REFERER

The following functions/methods are affected (There may be others):

  • Using site_url()
    • form_open()
    • audio()
    • embed()
    • img()
    • link_tag()
    • object()
    • script_tag()
    • source()
    • video()
    • RedirectResponse::route()
    • RedirectResponse::to()
    • Toolbar::prepare()
    • Toolbar::respond()
    • anchor()
    • anchor_popup()
    • base_url()
    • previous_url()
    • url_to()
  • Using base_url()
    • RedirectException in CodeIgnter.php L377
    • UserAgent::isReferral()
  • Using current_url()
    • ChromeLoggerHandler::__construct()
    • CodeIgniter::storePreviousURL()
    • Pager::ensureGroup()
    • Toolbar::run()

Ref #4651

Checklist:

  • Securely signed commits
  • Component(s) with PHPDoc blocks, only if necessary or adds value
  • Unit testing, with >80% coverage
  • User guide updated
  • Conforms to style guide

@kenjiskenjis added enhancement PRs that improve existing functionalities 4.3 labels Oct 26, 2022
protected function detectURI(string $protocol, string $baseURL)
{
// Passing the config is unnecessary but left for legacy purposes
// @TODO For what? Why clone?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The clone prevents URI testing from changing the App Config globally.

@kenjiskenjisOct 27, 2022

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The reason for clone is only for testing, I would like to remove it.

--- a/system/HTTP/IncomingRequest.php+++ b/system/HTTP/IncomingRequest.php@@ -195,12 +195,7 @@ class IncomingRequest extends Request
*/
protected function detectURI(string $protocol, string $baseURL)
{
- // Passing the config is unnecessary but left for legacy purposes- // @TODO For what? Why clone?- $config = clone $this->config;- $config->baseURL = $baseURL;-- $this->setPath($this->detectPath($protocol), $config);+ $this->setPath($this->detectPath($this->config->uriProtocol), $this->config);
}
/**

@MGatnerMGatnerOct 27, 2022

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

And deprecate the baseURL input? Is that really only for testing?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Both $protocol and $baseURL of detectURI() are not needed.

__construct():

$this->detectURI($config->uriProtocol, $config->baseURL);

protectedfunctiondetectURI(string$protocol, string$baseURL)
{
// Passing the config is unnecessary but left for legacy purposes
$config = clone$this->config;
$config->baseURL = $baseURL;
$this->setPath($this->detectPath($protocol), $config);
}

@michalsnmichalsn left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This may be very useful feature.

At some point we probably should consider providing some easy function (helper) to generate a URL to a different host than this defined in baseURL.

Comment threadsystem/HTTP/IncomingRequest.php
Comment threadsystem/HTTP/IncomingRequest.php Outdated
@kenjis
kenjisforce-pushed the improve-subdomain-support branch from b984b8f to 52a8589CompareOctober 27, 2022 04:53
@kenjis
kenjisforce-pushed the improve-subdomain-support branch from 52a8589 to b6e0976CompareOctober 27, 2022 05:08
@kenjis

Copy link
Copy Markdown
MemberAuthor

Is this a breaking change?

@MGatnerMGatner left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this is mostly okay. I want to hear more about the write-back to App Config - that seems like a pretty big possibility for issues to creep in, and ones that would be difficult to trace. As far as I can tell the logic here is all self-contained, and since current_url() uses this class we shouldn't need to touch the Config.


if ($config->baseURL === '') {
// @codeCoverageIgnoreStart
exit('You have an empty or invalid base URL. The baseURL value must be set in Config\App.php, or through the .env file.');

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This used to be conditional on !is_cli() - what is the justification or precedent for requiring CLI to have this set?

Comment on lines +420 to +423
// Update Config\App::$baseURL
$uri = new URI($baseURL);
$uri->setHost($host);
$this->config->baseURL = $uri;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I really don't like components updating global Config values. This seems like a bad idea. What does this fix?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Without this, all helpers will return "old" URLs, not one of those defined in allowedHostnames. That's basically the whole point of all these changes.

I have an app where subdomains and custom domains are used, but I use a more dynamic approach and handle it via Registrars. I would recommend this way, but the only downside is that we can't make it work with one config variable - it's a bit more complicated.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We need the current real baseURL with allowedHostnames in somewhere.
I think Config\App::$baseURL in shared Config object is best,
because the baseURL is only one in a request and never changes. I don't see any problems.

But if something wrong that I miss, we need to save the current baseURL somewhere else.
Where?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would rather see anything that needs to rely on "URL for the incoming request" to use a component that represents that (IncomingRequest, current_url(), etc). It seems very counterintuitive that our Config values are dependent on infrastructure context.

I get that this is the most straightforward approach to a fix, but I think it pokes a new hole in our architecture that is liable to leak, grow bigger, etc.

I'm not a fan of the proliferation of global URL helpers we already have but I would prefer something like current_base_url() to this.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Re: Registrars... I think that is a great solution at the project level, and would encourage it for individuals who need this currently.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Indeed, it may seem counter-intuitive that the value of one Config object changes dynamically.
I think it is better that the URI object in IncomingRequest has all the URL related data including the current baseURL.

Comment threadsystem/HTTP/IncomingRequest.php
@kenjis

Copy link
Copy Markdown
MemberAuthor

Go to #6785

@kenjiskenjis closed this Oct 29, 2022
@kenjis
kenjis deleted the improve-subdomain-support branch October 29, 2022 23:23
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancementPRs that improve existing functionalities

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@kenjis@michalsn@MGatner
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat: improve multiple domain support - #6759

Closed
kenjis wants to merge 17 commits into
codeigniter4:4.3from
kenjis:improve-subdomain-support
Closed

feat: improve multiple domain support#6759
kenjis wants to merge 17 commits into
codeigniter4:4.3from
kenjis:improve-subdomain-support

Conversation

@kenjis

@kenjiskenjis commented Oct 26, 2022

Copy link
Copy Markdown
Member

Description
Fixes#5807
Related #6746

  • add Config\App::$allowedHostnames
  • update Config\App::$baseURL in IncomingRequest if HTTP_HOST is an allowed hostname

Changes:

  • current_url(), base_url(), site_url() will return the URL with allowed HTTP_HOST
  • previous_url() will return the site URL with allowed HTTP_HOST when cannot get it from session nor HTTP_REFERER

The following functions/methods are affected (There may be others):

  • Using site_url()
    • form_open()
    • audio()
    • embed()
    • img()
    • link_tag()
    • object()
    • script_tag()
    • source()
    • video()
    • RedirectResponse::route()
    • RedirectResponse::to()
    • Toolbar::prepare()
    • Toolbar::respond()
    • anchor()
    • anchor_popup()
    • base_url()
    • previous_url()
    • url_to()
  • Using base_url()
    • RedirectException in CodeIgnter.php L377
    • UserAgent::isReferral()
  • Using current_url()
    • ChromeLoggerHandler::__construct()
    • CodeIgniter::storePreviousURL()
    • Pager::ensureGroup()
    • Toolbar::run()

Ref #4651

Checklist:

  • Securely signed commits
  • Component(s) with PHPDoc blocks, only if necessary or adds value
  • Unit testing, with >80% coverage
  • User guide updated
  • Conforms to style guide

@kenjiskenjis added enhancement PRs that improve existing functionalities 4.3 labels Oct 26, 2022
protected function detectURI(string $protocol, string $baseURL)
{
// Passing the config is unnecessary but left for legacy purposes
// @TODO For what? Why clone?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The clone prevents URI testing from changing the App Config globally.

@kenjiskenjisOct 27, 2022

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The reason for clone is only for testing, I would like to remove it.

--- a/system/HTTP/IncomingRequest.php+++ b/system/HTTP/IncomingRequest.php@@ -195,12 +195,7 @@ class IncomingRequest extends Request
*/
protected function detectURI(string $protocol, string $baseURL)
{
- // Passing the config is unnecessary but left for legacy purposes- // @TODO For what? Why clone?- $config = clone $this->config;- $config->baseURL = $baseURL;-- $this->setPath($this->detectPath($protocol), $config);+ $this->setPath($this->detectPath($this->config->uriProtocol), $this->config);
}
/**

@MGatnerMGatnerOct 27, 2022

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

And deprecate the baseURL input? Is that really only for testing?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Both $protocol and $baseURL of detectURI() are not needed.

__construct():

$this->detectURI($config->uriProtocol, $config->baseURL);

protectedfunctiondetectURI(string$protocol, string$baseURL)
{
// Passing the config is unnecessary but left for legacy purposes
$config = clone$this->config;
$config->baseURL = $baseURL;
$this->setPath($this->detectPath($protocol), $config);
}

@michalsnmichalsn left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This may be very useful feature.

At some point we probably should consider providing some easy function (helper) to generate a URL to a different host than this defined in baseURL.

Comment threadsystem/HTTP/IncomingRequest.php
Comment threadsystem/HTTP/IncomingRequest.php Outdated
@kenjis
kenjisforce-pushed the improve-subdomain-support branch from b984b8f to 52a8589CompareOctober 27, 2022 04:53
@kenjis
kenjisforce-pushed the improve-subdomain-support branch from 52a8589 to b6e0976CompareOctober 27, 2022 05:08
@kenjis

Copy link
Copy Markdown
MemberAuthor

Is this a breaking change?

@MGatnerMGatner left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this is mostly okay. I want to hear more about the write-back to App Config - that seems like a pretty big possibility for issues to creep in, and ones that would be difficult to trace. As far as I can tell the logic here is all self-contained, and since current_url() uses this class we shouldn't need to touch the Config.


if ($config->baseURL === '') {
// @codeCoverageIgnoreStart
exit('You have an empty or invalid base URL. The baseURL value must be set in Config\App.php, or through the .env file.');

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This used to be conditional on !is_cli() - what is the justification or precedent for requiring CLI to have this set?

Comment on lines +420 to +423
// Update Config\App::$baseURL
$uri = new URI($baseURL);
$uri->setHost($host);
$this->config->baseURL = $uri;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I really don't like components updating global Config values. This seems like a bad idea. What does this fix?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Without this, all helpers will return "old" URLs, not one of those defined in allowedHostnames. That's basically the whole point of all these changes.

I have an app where subdomains and custom domains are used, but I use a more dynamic approach and handle it via Registrars. I would recommend this way, but the only downside is that we can't make it work with one config variable - it's a bit more complicated.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We need the current real baseURL with allowedHostnames in somewhere.
I think Config\App::$baseURL in shared Config object is best,
because the baseURL is only one in a request and never changes. I don't see any problems.

But if something wrong that I miss, we need to save the current baseURL somewhere else.
Where?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would rather see anything that needs to rely on "URL for the incoming request" to use a component that represents that (IncomingRequest, current_url(), etc). It seems very counterintuitive that our Config values are dependent on infrastructure context.

I get that this is the most straightforward approach to a fix, but I think it pokes a new hole in our architecture that is liable to leak, grow bigger, etc.

I'm not a fan of the proliferation of global URL helpers we already have but I would prefer something like current_base_url() to this.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Re: Registrars... I think that is a great solution at the project level, and would encourage it for individuals who need this currently.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Indeed, it may seem counter-intuitive that the value of one Config object changes dynamically.
I think it is better that the URI object in IncomingRequest has all the URL related data including the current baseURL.

Comment threadsystem/HTTP/IncomingRequest.php
@kenjis

Copy link
Copy Markdown
MemberAuthor

Go to #6785

@kenjiskenjis closed this Oct 29, 2022
@kenjis
kenjis deleted the improve-subdomain-support branch October 29, 2022 23:23
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancementPRs that improve existing functionalities

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@kenjis@michalsn@MGatner
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

feat: improve multiple domain support - #6759

Closed
kenjis wants to merge 17 commits into
codeigniter4:4.3from
kenjis:improve-subdomain-support
Closed

feat: improve multiple domain support#6759
kenjis wants to merge 17 commits into
codeigniter4:4.3from
kenjis:improve-subdomain-support

Conversation

@kenjis

@kenjiskenjis commented Oct 26, 2022

Copy link
Copy Markdown
Member

Description
Fixes#5807
Related #6746

  • add Config\App::$allowedHostnames
  • update Config\App::$baseURL in IncomingRequest if HTTP_HOST is an allowed hostname

Changes:

  • current_url(), base_url(), site_url() will return the URL with allowed HTTP_HOST
  • previous_url() will return the site URL with allowed HTTP_HOST when cannot get it from session nor HTTP_REFERER

The following functions/methods are affected (There may be others):

  • Using site_url()
    • form_open()
    • audio()
    • embed()
    • img()
    • link_tag()
    • object()
    • script_tag()
    • source()
    • video()
    • RedirectResponse::route()
    • RedirectResponse::to()
    • Toolbar::prepare()
    • Toolbar::respond()
    • anchor()
    • anchor_popup()
    • base_url()
    • previous_url()
    • url_to()
  • Using base_url()
    • RedirectException in CodeIgnter.php L377
    • UserAgent::isReferral()
  • Using current_url()
    • ChromeLoggerHandler::__construct()
    • CodeIgniter::storePreviousURL()
    • Pager::ensureGroup()
    • Toolbar::run()

Ref #4651

Checklist:

  • Securely signed commits
  • Component(s) with PHPDoc blocks, only if necessary or adds value
  • Unit testing, with >80% coverage
  • User guide updated
  • Conforms to style guide

@kenjiskenjis added enhancement PRs that improve existing functionalities 4.3 labels Oct 26, 2022
protected function detectURI(string $protocol, string $baseURL)
{
// Passing the config is unnecessary but left for legacy purposes
// @TODO For what? Why clone?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The clone prevents URI testing from changing the App Config globally.

@kenjiskenjisOct 27, 2022

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The reason for clone is only for testing, I would like to remove it.

--- a/system/HTTP/IncomingRequest.php+++ b/system/HTTP/IncomingRequest.php@@ -195,12 +195,7 @@ class IncomingRequest extends Request
*/
protected function detectURI(string $protocol, string $baseURL)
{
- // Passing the config is unnecessary but left for legacy purposes- // @TODO For what? Why clone?- $config = clone $this->config;- $config->baseURL = $baseURL;-- $this->setPath($this->detectPath($protocol), $config);+ $this->setPath($this->detectPath($this->config->uriProtocol), $this->config);
}
/**

@MGatnerMGatnerOct 27, 2022

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

And deprecate the baseURL input? Is that really only for testing?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Both $protocol and $baseURL of detectURI() are not needed.

__construct():

$this->detectURI($config->uriProtocol, $config->baseURL);

protectedfunctiondetectURI(string$protocol, string$baseURL)
{
// Passing the config is unnecessary but left for legacy purposes
$config = clone$this->config;
$config->baseURL = $baseURL;
$this->setPath($this->detectPath($protocol), $config);
}

@michalsnmichalsn left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This may be very useful feature.

At some point we probably should consider providing some easy function (helper) to generate a URL to a different host than this defined in baseURL.

Comment threadsystem/HTTP/IncomingRequest.php
Comment threadsystem/HTTP/IncomingRequest.php Outdated
@kenjis
kenjisforce-pushed the improve-subdomain-support branch from b984b8f to 52a8589CompareOctober 27, 2022 04:53
@kenjis
kenjisforce-pushed the improve-subdomain-support branch from 52a8589 to b6e0976CompareOctober 27, 2022 05:08
@kenjis

Copy link
Copy Markdown
MemberAuthor

Is this a breaking change?

@MGatnerMGatner left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this is mostly okay. I want to hear more about the write-back to App Config - that seems like a pretty big possibility for issues to creep in, and ones that would be difficult to trace. As far as I can tell the logic here is all self-contained, and since current_url() uses this class we shouldn't need to touch the Config.


if ($config->baseURL === '') {
// @codeCoverageIgnoreStart
exit('You have an empty or invalid base URL. The baseURL value must be set in Config\App.php, or through the .env file.');

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This used to be conditional on !is_cli() - what is the justification or precedent for requiring CLI to have this set?

Comment on lines +420 to +423
// Update Config\App::$baseURL
$uri = new URI($baseURL);
$uri->setHost($host);
$this->config->baseURL = $uri;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I really don't like components updating global Config values. This seems like a bad idea. What does this fix?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Without this, all helpers will return "old" URLs, not one of those defined in allowedHostnames. That's basically the whole point of all these changes.

I have an app where subdomains and custom domains are used, but I use a more dynamic approach and handle it via Registrars. I would recommend this way, but the only downside is that we can't make it work with one config variable - it's a bit more complicated.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We need the current real baseURL with allowedHostnames in somewhere.
I think Config\App::$baseURL in shared Config object is best,
because the baseURL is only one in a request and never changes. I don't see any problems.

But if something wrong that I miss, we need to save the current baseURL somewhere else.
Where?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would rather see anything that needs to rely on "URL for the incoming request" to use a component that represents that (IncomingRequest, current_url(), etc). It seems very counterintuitive that our Config values are dependent on infrastructure context.

I get that this is the most straightforward approach to a fix, but I think it pokes a new hole in our architecture that is liable to leak, grow bigger, etc.

I'm not a fan of the proliferation of global URL helpers we already have but I would prefer something like current_base_url() to this.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Re: Registrars... I think that is a great solution at the project level, and would encourage it for individuals who need this currently.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Indeed, it may seem counter-intuitive that the value of one Config object changes dynamically.
I think it is better that the URI object in IncomingRequest has all the URL related data including the current baseURL.

Comment threadsystem/HTTP/IncomingRequest.php
@kenjis

Copy link
Copy Markdown
MemberAuthor

Go to #6785

@kenjiskenjis closed this Oct 29, 2022
@kenjis
kenjis deleted the improve-subdomain-support branch October 29, 2022 23:23
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancementPRs that improve existing functionalities

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@kenjis@michalsn@MGatner