Подкаталог .htaccess mod_rewrite к параметру URL - PullRequest
2 голосов
/ 17 декабря 2011

Я надеюсь, что раньше об этом не спрашивали снова и снова, но я не получил дальнейшего ответа, используя google, w3schools и так далее.Итак, вот мой вопрос: я пишу скрипт, который создает своего рода индекс проектов, которые у меня есть на моей домашней странице, и создает хороший список с изображениями и текстом тизера на основе информационного файла.У меня в основном мои проекты на github, а readme находится в уценке, поэтому я подумал, что могу динамически генерировать HTML из уценки последнего большого двоичного объекта из github по требованию, используя PHP, чтобы он обновлялся автоматически.Моя структура каталогов выглядит следующим образом:

projects
    project1
        .remoteindex
        .info
    project2
        .remoteindex
        .info
    index.php
    .htaccess

Поэтому, когда запрашивается только domain.tld/projects/, я получаю информацию из .info и создаю хороший индекс всех проектов.Но если domain.tld/projects/project1/ запрашивает его, я хочу внутренне перенаправить его на domain.tld/projects/?dir=project1, чтобы выполнить мой анализ уценки и так далее.Но domain.tld/projects/project1/image.png не следует перенаправлять.

Это то, что я пробовал:

.htaccess
RewriteEngine on
RewriteRule ^([^/]+)/?$ index.php?dir=$1 [R,L]

Я сделал перенаправление вместо перезаписи, чтобы я мог видеть, что ошибка, потому что я только что получил404. URL, на который я перенаправлен, - domain.tld/home/www/web310/html/projects/index.php?dir=project1, поэтому очевидно, что что-то не так с внутренней структурой веб-сервера и путями.Я надеюсь, что вы понимаете мою проблему, и я был бы очень рад, если бы кто-то мог мне помочь, потому что я все равно потерял на .htaccess.

Редактировать:

Смотрите мой ответ ниже дляиспользуемый .htaccess.

Странно то, что если у меня есть index.html в одном из подкаталогов, мой локальный веб-сервер (Apache с XAMPP для Mac OS X 1.7.3) не переписывает иindex.html отображается, но без него он работает правильно. Но на моем реальном веб-сервере, который обслуживает мою домашнюю страницу, он переписывает как с index.html, так и без него (что я и хочу).Есть намеки на это?

Ответы [ 3 ]

3 голосов
/ 18 декабря 2011

Спасибо за всю помощь! Вы, ребята, просто потрясающие!

Я понял, что симбиоз обоих ваших решений хорошо работает для меня:

RewriteEngine on
RewriteBase /projects
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteCond %{SCRIPT_FILENAME} -d
RewriteRule ^([^/]+)/?$ index.php?dir=$1 [QSA,L]

Конечно, только без [R], это была моя вина. (Смотрите мой вопрос, отредактируйте другой вопрос, пожалуйста).

0 голосов
/ 18 декабря 2011

После того, как вы спросите, важно не для перенаправления, но позволить rewriterule изменить внутренне URL, т.е. RewriteRule должен не заканчивается [R,L], а скорее [L] и, возможно, директивой "query string append", чтобы сохранить то, что следует за ?, так что это, вероятно, должно быть [QSA,L].

Теперь вот как я бы сделал, чтобы избежать перезаписи статических файлов: если это не файл, то (и только тогда) протестируйте его:

# if it's not a file...
RewriteCond %{SCRIPT_FILENAME} !-f
# ... and it's a dir
RewriteCond %{SCRIPT_FILENAME} -d
# ... then rewrite it internally and stop further processing:
RewriteRule projects/([^/]+)(/?)$ index.php?dir=$1 [QSA,L]

А теперь две подсказки:

Пожалуйста, попробуйте использовать директиву RewriteLog: она поможет вам отследить такие проблемы:

# Trace:
# (!) file gets big quickly, remove in prod environments:
RewriteLog "/web/logs/mywebsite.rewrite.log"
RewriteLogLevel 9
RewriteEngine On

Мой любимый инструмент для проверки регулярных выражений:

http://www.quanetic.com/Regex (не забудьте выбрать ereg (POSIX) вместо preg (PCRE)!)

0 голосов
/ 17 декабря 2011

Вам необходимо добавить RewriteBase /projects в htaccess.Таким образом, перенаправление будет работать правильно.

Редактировать:

RewriteEngine on
RewriteRule ^index.php - [L]
RewriteRule ^([^/]+)/?$ index.php?dir=$1 [R,L]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...