Ошибка 403, если в URI содержится символ “:”

160
28 января 2020, 06:30

Так сложилось, что мне в моем веб-приложении (php + Laravel 5.8) нужно обрабатывать маршрут который содержит символ ":" (httt://example.ru/test:sub). Уйди от этого символа возможности нет. Проект работает на хостинге под asp.net, и там все отлично отрабатывает. Когда я его разворачиваю локально, мой OpenServer (Apache) наотрез отказывается принимать такой uri и возвращает 403 ошибку.

Так все работает и локально и на хостинге:

Route::get('/testsub', function () {
    return view('test');
});

Так работает только на хостинге, локально - 403 ошибка:

Route::get('/test:sub', function () {
    return view('test');
});

На удаленном хостинге файл web.config:

<configuration>
<system.webServer>
<rewrite>
  <rules>
    <rule name="Imported Rule 1" stopProcessing="true">
      <match url="^(.*)/$" ignoreCase="false" />
      <conditions>
        <add input="{REQUEST_FILENAME}" matchType="IsDirectory" ignoreCase="false" negate="true" />
      </conditions>
      <action type="Redirect" redirectType="Permanent" url="/{R:1}" />
    </rule>
    <rule name="Imported Rule 2" stopProcessing="true">
      <match url="^" ignoreCase="false" />
      <conditions>
        <add input="{REQUEST_FILENAME}" matchType="IsDirectory" ignoreCase="false" negate="true" />
        <add input="{REQUEST_FILENAME}" matchType="IsFile" ignoreCase="false" negate="true" />
      </conditions>
      <action type="Rewrite" url="index.php" />
    </rule>
  </rules>
</rewrite>

Локально .htaccess

<IfModule mod_rewrite.c>
<IfModule mod_negotiation.c>
    Options -MultiViews -Indexes
</IfModule>
RewriteEngine On
# Handle Authorization Header
RewriteCond %{HTTP:Authorization} .
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
# Redirect Trailing Slashes If Not A Folder...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} (.+)/$
RewriteRule ^ %1 [L,R=301]
# Handle Front Controller...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]

Прошу, помогите указать на ошибку. Очень нужно работать с этим проектом локально, т.к. работы очень много.

Answer 1

Apache под Windows не разрешает использовать двоеточие в первой части пути (в Linux такой проблемы нет)

Если это приемлемо, попробуйте добавить еще один уровень вложенности:

Route::get('/subdir/test:sub', function () {
    return view('test');
});

Или используйте сервер PHP вместо апача:

php artisan serve

после запуска этой команды сайт будет доступен по http://127.0.0.1:8000

READ ALSO
Изменение сортировки по умолчанию (php)

Изменение сортировки по умолчанию (php)

Хочу сменить сортировку на сайте с "по-умолчанию" на "сначала дорогие"Долго возился, но не смог сделать сам

145
Php удаление блока Div по ID из файла

Php удаление блока Div по ID из файла

Как удалить div из файла html по id?

150
Передача массива по значению С++

Передача массива по значению С++

Говорят что в С++ нельзя передать массив по значению в функцию, тогда объясните что делает мой кусок кода: `

181
Как вызвать функцию из main()?

Как вызвать функцию из main()?

Я только начал изучать указатели (1 день) и не могу понять как передать указатель из функции create_matrix() в main(), а в ней уже вызвать другую функцию...

179