diff --git a/.env b/.env index 6ad69ce3..87be6efe 100644 --- a/.env +++ b/.env @@ -39,4 +39,8 @@ MAILER_URL=null://localhost FIXER_API_KEY=CHANGEME +# Change this to true, if no url rewriting (like mod_rewrite for Apache) is available +# In that case all URL contains the index.php front controller in URL +NO_URL_REWRITE_AVAILABLE=false + ### End custom vars \ No newline at end of file diff --git a/assets/ts_src/ajax_ui.ts b/assets/ts_src/ajax_ui.ts index 8d8d0788..a237f14d 100644 --- a/assets/ts_src/ajax_ui.ts +++ b/assets/ts_src/ajax_ui.ts @@ -76,7 +76,11 @@ class AjaxUI { console.info("AjaxUI started!"); - this.BASE = $("body").data("base-url") + "/"; + this.BASE = $("body").data("base-url"); + //If path doesn't end with slash, add it. + if(this.BASE[this.BASE.length - 1] !== '/') { + this.BASE = this.BASE + '/'; + } console.info("Base path is " + this.BASE); //Show flash messages diff --git a/config/services.yaml b/config/services.yaml index 4c366ec8..589d7aaa 100644 --- a/config/services.yaml +++ b/config/services.yaml @@ -53,6 +53,7 @@ services: App\Controller\RedirectController: arguments: $default_locale: '%locale%' + $enforce_index_php: '%env(bool:NO_URL_REWRITE_AVAILABLE)%' App\Command\UpdateExchangeRatesCommand: arguments: diff --git a/src/Controller/RedirectController.php b/src/Controller/RedirectController.php index ab7a2240..4c3ab6bb 100644 --- a/src/Controller/RedirectController.php +++ b/src/Controller/RedirectController.php @@ -42,14 +42,22 @@ class RedirectController extends AbstractController protected $default_locale; protected $translator; protected $session; + protected $enforce_index_php; - public function __construct(string $default_locale, TranslatorInterface $translator, SessionInterface $session) + public function __construct(string $default_locale, TranslatorInterface $translator, SessionInterface $session, bool $enforce_index_php) { $this->default_locale = $default_locale; $this->session = $session; $this->translator = $translator; + $this->enforce_index_php = $enforce_index_php; } + /** + * This function is called whenever a route was not matching the localized routes. + * The purpose is to redirect the user to the localized version of the page. + * @param Request $request + * @return \Symfony\Component\HttpFoundation\RedirectResponse + */ public function addLocalePart(Request $request) { //By default we use the global default locale @@ -69,6 +77,31 @@ class RedirectController extends AbstractController //$new_url = str_replace($request->getPathInfo(), '/' . $locale . $request->getPathInfo(), $request->getUri()); $new_url = $request->getUriForPath('/' . $locale . $request->getPathInfo()); + + //If either mod_rewrite is not enabled or the index.php version is enforced, add index.php to the string + if (($this->enforce_index_php || !$this->checkIfModRewriteAvailable()) + && strpos($new_url, 'index.php') === false) { + //Like Request::getUriForPath only with index.php + $new_url = $request->getSchemeAndHttpHost(). $request->getBaseUrl().'/index.php/' . $locale . $request->getPathInfo(); + } return $this->redirect($new_url); } + + /** + * Check if mod_rewrite is availabe (URL rewriting is possible). + * If this is true, we can redirect to /en, otherwise we have to redirect to index.php/en. + * When the PHP is not used via Apache SAPI, we just assume that URL rewriting is available + * @return bool + */ + public function checkIfModRewriteAvailable() + { + if (!function_exists('apache_get_modules')) { + //If we can not check for apache modules, we just hope for the best and assume url rewriting is available + //If you want to enforce index.php versions of the url, you can override this via ENV vars. + return true; + } + + //Check if the mod_rewrite module is loaded + return in_array('mod_rewrite', apache_get_modules(), false); + } } \ No newline at end of file diff --git a/templates/base.html.twig b/templates/base.html.twig index 6be546ea..89319e2b 100644 --- a/templates/base.html.twig +++ b/templates/base.html.twig @@ -18,7 +18,7 @@ {{ encore_entry_link_tags('app') }} {% endblock %} - + {% block body %}