Содержимое .htaccess, доступ к которому осуществляется через 2 URL-адреса, всегда перенаправляет на первый URL-адрес. - PullRequest
0 голосов
/ 26 января 2012

Итак, у меня странная настройка сервера, которую я не контролирую.Мой производственный сайт выглядит следующим образом:

/www/users/name    <- server points here
    /public    <- I want it to point here, but I don't have that option
        index.php    <- all requests should eventually end up here

К нему можно получить доступ через www.test.com / users / name AND www.test.com / ~ name

Мой сайт разработчика выглядит так:

/www/name/public    <- dev server points here
    index.php    <- all requests should eventually end up here

Доступ к нему осуществляется только через www.test.dev

Я используюPHP Framework, который заставляет мои URL всегда иметь одинаковую базу для работы (Laravel).Так что www.test.com / ~ name / stuff будет работать, но www.test.com / users / name / stuff НЕ будет работать.Я хотел бы, чтобы мои URL-адреса всегда отображались как первые, чтобы обойти эту проблему.

Я создал файл .htaccess для своего производственного базового каталога, который всегда будет перенаправлять в общедоступный каталог, например:

    RewriteEngine on

    RewriteRule ^(.*)$ public/$1

В общедоступном каталоге есть файл .htaccess, подобный этому, который поставляется с используемой платформой (которую я не хотел бы менять, так как мой dev-сайт прекрасно с ней работает):

    RewriteEngine on

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d

    RewriteRule ^(.*)$ index.php/$1 [L]

При этом все / ~ name запросы работают отлично, но ни один из / users / name не работает. Как исправить файл .htaccess моего производственного базового каталога так, чтобы все запросы от / users / name к / ~ name?

Я попытался добавить:

RedirectMatch ^/users/name/(.*)$ /~name/$1

Что не работает, потому что переписаны раскрыты.Например, если я запрашиваю www.test.com / ~ name / stuff , это отображается как www.test.com / ~ name / public / index.php / stuff .Без строки RedirectMatch все ~ запросы имен работают отлично.

Любопытно, если я поменяю вышеприведенное правило на:

RedirectMatch ^/~name/(.*)$ /users/name/$1

Все работает отлично, за исключением того, что мои URL всегда будут иметь / users / name вместо / ~ name , как я бы предпочел.

Очевидно, я готов с этим жить, если то, что я спрашиваю, невозможно.Если бы кто-то мог объяснить, почему вышесказанное работает, а предыдущий - нет, это тоже было бы неплохо.Я обнаружил, что могу заставить работать первый, добавив RedirectBase / ~ name в ОБА файлы .htaccess, но, как я упоминал выше, я не хотел бы изменять публичный файл .htaccess, так как обаDev и производственные среды используют его.

Заранее спасибо!

1 Ответ

0 голосов
/ 26 января 2012

Следующее работает для меня:

RewriteEngine on

RewriteBase /~name    

RewriteCond %{REQUEST_URI} /users/name(.*)
RewriteRule ^(.*)$ $1 [L,R]

RewriteRule ^(.*)$ public/$1

Все еще не уверен, почему это работает, а то, что я описал выше, не ... Предположение: я предполагаю, что это как-то связано, когда перенаправление происходит изRedirectMatch.В этой версии я заставляю перенаправление с / users / name на / ~ name всегда происходить первым, прежде чем произойдет любое другое переписывание.Я полагаю, что перенаправление из RedirectMatch выше происходило после других перезаписей, именно поэтому перезаписи появились в адресной строке.Я также думаю, что Redirect в другом направлении работал нормально, потому что, скорее всего, существует псевдоним для / ~ name для фактического пути / users / name.Поэтому он должен заменить / ~ name на / users / name в одном случае, но не в другом.

...