Я пытаюсь получить правила перезаписи для работы с IIS для CakePHP, используя следующие параметры web.config, которые находятся в корневой папке:
<?xml version="1.0" encoding="UTF-8"?> <configuration> <system.webServer> <rewrite> <rules> <rule name="Imported Rule 1" stopProcessing="true"> <match url="^$" ignoreCase="false" /> <action type="Rewrite" url="app/webroot/" /> </rule> <rule name="Imported Rule 2" stopProcessing="true"> <match url="(.*)" ignoreCase="false" /> <action type="Rewrite" url="app/webroot/{R:1}" /> </rule> <rule name="Imported Rule 3" stopProcessing="true"> <match url="^$" ignoreCase="false" /> <action type="Rewrite" url="webroot/" /> </rule> <rule name="Imported Rule 4" stopProcessing="true"> <match url="(.*)" ignoreCase="false" /> <action type="Rewrite" url="webroot/{R:1}" /> </rule> <rule name="Imported Rule 5" stopProcessing="true"> <match url="^(.*)$" ignoreCase="false" /> <conditions> <add input="{REQUEST_FILENAME}" matchType="IsDirectory" ignoreCase="false" negate="true" /> <add input="{REQUEST_FILENAME}" matchType="IsFile" ignoreCase="false" negate="true" /> </conditions> <action type="Rewrite" url="index.php" appendQueryString="true" /> </rule> </rules> </rewrite> </system.webServer> </configuration>
Все CSS, JS и другие файлы работают нормально. Как и загрузка на домашней странице, но другие страницы, такие как /pages/about
просто показывают 404!
EDIT: Снимок экрана установки в IIS:
В чем проблема? благодаря
У меня нет большого опыта работы с IIS, но, возвращаясь к этому вопросу, я замечаю некоторые вопиющие проблемы. IIS импортировал все три из .htaccess CakePHP без всякого учета того, в какой каталог они содержатся.
CakePHP поставляется с двумя дополнительными файлами .htaccess, чтобы пользователи могли легко выполнить установку в Apache, и, независимо от URL-адреса, который они пытаются, они всегда (надеюсь) должны быть перенаправлены в правильный файл .htaccess, и все должно «работать» (TM ):
Document root Additional .htaccess file Correct .htaccess file / --------------> /.htaccess -----------------> /app/webroot/.htaccess /app/ ----------> /app/.htaccess -------------> /app/webroot/.htaccess /app/webroot ---------------------------------> /app/webroot/.htaccess
Способ, которым IIS импортировал эти файлы, при условии, что ваш корень документа установлен в /
, правила 3-4 (из второго файла .htaccess) не нужны. Но что более важно, из-за общего правила regex (.*)
В правиле 2 (из первого файла .htaccess) никакое правило, выходящее за правило 2, никогда не будет выполняться – значит, запросы никогда не будут переданы index.php.
Во всяком случае, вы не используете Apache, поэтому вы не можете случайно запускать установки CakePHP, ожидая, что они просто начнут работать. Правильный корень документа для использования в производственных средах (для обеспечения производительности и безопасности) на любом веб-сервере (Apache, IIS, Nginx и т. Д.) – это подходящий каталог named /app/webroot
. Этот каталог содержит index.php, статические файлы и правильный файл .htaccess.
После этого все, что вам нужно, это правило 5 (из правильного файла .htaccess). В основном он гласит: «сопоставлять все запросы и отправлять их в index.php, если нет реального файла или каталога, который мы можем обслуживать»:
<?xml version="1.0" encoding="UTF-8"?> <configuration> <system.webServer> <rewrite> <rules> <rule name="CakePHP" stopProcessing="true"> <match url="^(.*)$" ignoreCase="false" /> <conditions> <add input="{REQUEST_FILENAME}" matchType="IsDirectory" ignoreCase="false" negate="true" /> <add input="{REQUEST_FILENAME}" matchType="IsFile" ignoreCase="false" negate="true" /> </conditions> <action type="Rewrite" url="index.php" appendQueryString="true" /> </rule> </rules> </rewrite> </system.webServer> </configuration>
IIS7 не поддерживает файлы .htaccess. Хотя есть дополнения, которые могут добавить эту поддержку, вы также можете импортировать правила htaccess в IIS для использования собственных перезаписей CakePHP. Для этого выполните следующие действия:
1.Используйте установщик веб-платформы Microsoft для установки модуля URL Rewrite 2.0 или загрузите его напрямую (32-разрядный / 64-разрядный).
2. Создайте новый файл в корневой папке CakePHP, называемой web.config.
3.Использование Блокнота или любого XML-безопасного редактора и скопируйте следующий код в новый файл web.config …
<?xml version="1.0" encoding="UTF-8"?> <configuration> <system.webServer> <rewrite> <rules> <rule name="Redirect static resources" stopProcessing="true"> <match url="^(ico|img|css|files|js)(.*)$" /> <action type="Rewrite" url="app/webroot/{R:1}{R:2}" appendQueryString="false" /> </rule> <rule name="Imported Rule 1" stopProcessing="true"> <match url="^(.*)$" ignoreCase="false" /> <conditions logicalGrouping="MatchAll"> <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" /> </conditions> <action type="Rewrite" url="index.php?url={R:1}" appendQueryString="true" /> </rule> <rule name="Imported Rule 2" stopProcessing="true"> <match url="^$" ignoreCase="false" /> <action type="Rewrite" url="/" /> </rule> <rule name="Imported Rule 3" stopProcessing="true"> <match url="(.*)" ignoreCase="false" /> <action type="Rewrite" url="/{R:1}" /> </rule> <rule name="Imported Rule 4" stopProcessing="true"> <match url="^(.*)$" ignoreCase="false" /> <conditions logicalGrouping="MatchAll"> <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" /> </conditions> <action type="Rewrite" url="index.php?url={R:1}" appendQueryString="true" /> </rule> </rules> </rewrite> </system.webServer> </configuration>