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

Mod_rewrite игнорирует расширение файла

Это все мое условие mod_rewrite:

<IfModule mod_rewrite.c>
   <Directory /var/www/>
    Options FollowSymLinks -Multiviews
    AllowOverride None
    Order allow,deny
    allow from all

    RewriteEngine On

    # force www. (also does the IP thing)
    RewriteCond %{HTTPS} !=on
    RewriteCond %{HTTP_HOST} !^mysite\.com [NC]
    RewriteRule ^(.*)$ http://mysite.com/$1 [R=301,L]

    RewriteCond %{REQUEST_URI} ^system.*
    RewriteRule ^(.*)$ /index.php?/$1 [L]   
    RewriteCond %{REQUEST_URI} ^application.*
    RewriteRule ^(.*)$ /index.php?/$1 [L]

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.+)\.(\d+)\.(js|css|png|jpg|gif)$ $1.$3 [L]

    RewriteCond %{THE_REQUEST} /index\.(php|html)
    RewriteRule (.*)index\.(php|html)(.*)$ /$1$3 [r=301,L]

    RewriteCond %{REQUEST_URI} !^(/index\.php|/assets|/robots\.txt|/sitemap\.xml|/favicon\.ico)
    RewriteRule ^(.*)$ /index.php/$1 [L]

    # Block access to "hidden" directories or files whose names begin with a period. This
    # includes directories used by version control systems such as Subversion or Git.
    RewriteCond %{SCRIPT_FILENAME} -d [OR]
    RewriteCond %{SCRIPT_FILENAME} -f
    RewriteRule "(^|/)\." - [F]
   </Directory>
</IfModule>

Предполагается разрешить доступ только к mysite.com (/index.php|/assets|/robots.txt|/sitemap.xml|/favicon.ico)

Ошибка была замечена с: mysite.com/sitemap vs mysite.com/sitemap.xml Оба этих адреса разрешаются в файл xml, в то время как первый URL-адрес должен разрешаться в mysite.com/index.php/sitemap ***

Почему-то mod_rewrite полностью игнорирует отсутствие расширения. Мне это показалось проблемой Multiviews, поэтому я отключил Multiviews, и она все еще продолжается.

*** И тогда другое правило в конечном итоге отключит index.php, у меня возникла другая проблема с оставлением лишнего '/', когда это произойдет.

Этот файл httpd настраивается для моей php-инфраструктуры codeigniter

Ответ: Что ж, я нашел проблему, оказалось, что, хотя я отключил Multiviews в моем файле httpd.conf, они все еще были включены в / etc / apache2 / sites-available / default, а также в / etc / apache2 / sites-available / по умолчанию-ssl

Эта пара:

RewriteCond %{REQUEST_URI} !^(/index\.php|/assets|/robots\.txt|/sitemap\.xml|/favicon\.ico)
RewriteRule ^(.*)$ /index.php/$1 [L]

По-разному относитесь к двум URI. /sitemap.xml не соответствует RewriteCond и передается в файловую систему. /sitemap соответствует RewriteCond и переписывается на /index.php/sitemap.

Возникает вопрос: что ваше приложение делает с этим URI? Если он найдет sitemap.xml файл и обслуживает его, что объясняет наблюдаемое вами поведение.

Я действительно не вижу, как эти переписывания могут послужить /sitemap.xml когда запрос был /sitemap. Один из способов проверить, выполняется ли запрос через ваше приложение или нет, - создать новый файл журнала и настроить приложение так, чтобы оно добавляло к нему строку для каждого запроса, которая включает дату, URI запроса и то, что оно планирует обслуживать (или из какого модуля запускается код).


Возможно, вам придется подробнее остановиться на проблеме "лишнего слеша" и, возможно, привести несколько примеров. Я не совсем понимаю вопрос.

С комментариями теперь я понимаю, что проблема косой черты здесь:

RewriteCond %{THE_REQUEST} /index\.(php|html)
RewriteRule (.*)index\.(php|html)(.*)$ /$1$3 [r=301,L]

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

RewriteCond %{THE_REQUEST} /index\.(php|html)
RewriteRule (.*)index\.(php|html)/(.*)$ /$1$3 [r=301,L]