Это все мое условие 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]