Мод переписать в подкаталог - PullRequest
0 голосов
/ 16 апреля 2011

У меня возникли проблемы с тем, чтобы заставить работать следующее:

<IfModule mod_rewrite.c>
    DirectoryIndex index.php

    Options +FollowSymLinks

    RewriteEngine On

    # If the file is not found in web

    RewriteCond  web/$1 -f [NC] #<-- This line seems to be the problem.
    RewriteRule  ^(.*)$  web/$1  [L]

    # Then rewrite it to index.php

    RewriteRule ^(.*)$ index.php [L,QSA]
</IfModule>

Идея состоит в том, чтобы проверить, существует ли файл в веб-каталоге, и, если это не так, направить запрос в index.php.

Кажется, что проблемная строка выше подбирает правильный URL, но не распознает, что файл существует.

Например:

http://localhost/img.gif --> /www/web/img.gif
http://localhost/subdir/file.doc --> /www/web/subdir/file.doc
http://localhost/user/add --> /www/index.php
http://localhost/invalidurl --> /www/index.php

Однако я не могу заставить статические ресурсы обслуживаться правильно, они все перенаправляются в index.php.

Я также хочу, чтобы все URL были относительными; так что я могу сделать этот код многоразовым без редактирования.

Следующий .htaccess выдает внутреннюю ошибку сервера, если я захожу на img.gif:

<IfModule mod_rewrite.c>
    DirectoryIndex index.php

    Options +FollowSymLinks

    RewriteEngine On

    # If the file is not found in web

    #RewriteCond  web/$1 -f [NC] #<-- This line seems to be the problem.
    RewriteRule  ^(.*)$  web/$1  [L]

    # Then rewrite it to index.php

    #RewriteRule ^(.*)$ index.php [L,QSA]
</IfModule>

Этот .htaccess перенаправляет на http://localhost/C:/absolute/path/to/web/img.gif, при посещении img.gif:

<IfModule mod_rewrite.c>
    DirectoryIndex index.php

    Options +FollowSymLinks

    RewriteEngine On

    # If the file is not found in web

    #RewriteCond  web/$1 -f [NC] #<-- This line seems to be the problem.
    RewriteRule  ^(.*)$  web/$1  [R]

    # Then rewrite it to index.php

    #RewriteRule ^(.*)$ index.php [L,QSA]
</IfModule>

Мой вывод из этого состоит в том, что он получает правильный путь, но какая-то странность заставляет его делать что-то совершенно странное (я даже не знаю, почему у него есть внутренняя ошибка сервера - должно быть 404 не найдено).

1 Ответ

1 голос
/ 18 апреля 2011

Хорошо, я понял:

Когда вы делаете перезапись, имейте в виду, что переписанный URL-адрес вызывается внутри.Таким образом, вам в основном приходится повторно обрабатывать .htaccess с в основном разными значениями.

Итак, в вашем примере: http://localhost/img.gif направлено на http://localhost/web/img.gif, а затем на http://localhost/index.php по последнему правилу.

Я бы попробовал это (замените последнее правило на:)

RewriteCond %{SCRIPT_NAME} !^/web/
RewriteRule ^(.*)$ index.php [L]

(Примечание: [QSA] не требуется, поскольку вы не трогаете строку запроса, поэтому она передается как есть.)

Редактировать : А как насчет

# If the file is not found in web
RewriteCond  web/$1 !-f [NC]
# And we don't ask for /web/something at the beginning (Avoid infinite loops since you'll try to call web/image.gif and we don't want to test /web/web/image.gif and fail to index.php
RewriteCond %{SCRIPT_NAME} !^/web/
#Rewrite it to index.php
RewriteRule  ^(.*)$  index.php  [R,L]

# If the file is found in web 
RewriteCond  web/$1 -f [NC]
# And we don't ask for /web/something at the beginning (Avoid infinite loops since you'll try to call web/image.gif and we don't want to test /web/web/image.gif and fail to index.php
RewriteCond %{SCRIPT_NAME} !^/web/    
#Then point to web/image.gif
RewriteRule ^(.*)$ web/$1 [L]
...