Назад | Перейти на главную страницу

Почему не работает RewriteBase?

Вот что я пытаюсь сделать:

  • домен thinkmonkey.me
  • домен имеет 127.0.0.1 в качестве IP-адреса
  • mod_alias установлен.

У меня есть файл conf под названием directories.conf. В котором у меня есть вся конфигурация, относящаяся к каталогам. directories.conf входит в httpd.conf

Мой directories.conf имеет

Alias /runs /xhprof/xhprof_html

<Directory /mysite/xhprof/xhprof_html>
    Order allow,deny
    Allow from all
    AllowOverride All
</Directory>

В /mysite/xhprof/xhprof_html/.htaccess. Имею следующее:

RewriteEngine on
RewriteBase /runs
RewriteRule  .*  index.php

Все, что я пытаюсь сделать, это направить любой запрос под /mysite/xhprof/xhprof_html/ к index.php.

Когда я прошу thinkingmonkey.me/runs без косой черты в конце я получил 404 not found.

Итак, я предполагаю, что RewriteBase не работает.
Что я делаю не так?

Здесь есть пара вещей. Во-первых, Alias директива хочет, чтобы его правая сторона была абсолютным физическим путем на сервере: вы хотите

Alias /runs /mysite/xhprof/xhprof_html

<Directory /mysite/xhprof/xhprof_html>
    Order allow,deny
    Allow from all
    AllowOverride All
</Directory>

Во-вторых, RewriteRule RewriteRule .* index.php соответствует не только http://.../runs, но также любой URL, начинающийся с http://.../runs/, даже, например, http://.../runs/css/.... Есть несколько способов обойти это.

 

Вариант 1: RewriteRule может перенаправлять только корень прогонов на index.php:

    RewriteRule ^$ index.php
    RewriteRule ^/$ index.php

 

Вариант 2: вы можете настроить mod_rewrite для особых случаев, которые существуют в виде файлов, и перенаправить все остальное в index.php

    # Require the path the request translates to is an existing file
    RewriteCond %{REQUEST_FILENAME} -f
    # Don't rewrite it, but do stop mod_rewrite processing
    RewriteRule .* - [L]

    # Now, redirect anything into index.php
    RewriteRule .* index.php

 

Вариант 3: вы можете указать определенные URL-адреса и перенаправить все остальное на index.php

    RewriteCond $1 !^css/
    RewriteCond $1 !^js/
    RewriteRule .* index.php

 

Вариант 4: если вы хотите, чтобы любое сопоставление URL-адресов с каталогом отображало index.php файл (как index.html) есть действительно простой способ, который, вероятно, вам и нужен. Вы можете поместить следующее либо в .htaccess или внутри <Directory> блокировать в directories.conf:

    DirectoryIndex index.php index.html

 

Сноска: приведенные выше правила RewriteRules в основном отбрасывают весь URL-адрес для любого запроса, который заканчивается сопоставлением с index.php. Это включает в себя строки запроса, поэтому /runs/?foo=bar такой же как /runs/. Если это не то, что вы хотите, вам нужно правило вроде

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

который сохраняет как информацию о пути ( $1 часть) и строку запроса ("QSA" = "добавление строки запроса".)

Я уже слишком много написал? :)