Вот что я пытаюсь сделать:
- домен 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" = "добавление строки запроса".)
Я уже слишком много написал? :)