Я обновляю приложение php, которое в настоящее время не использует переписывание URL. Цель состоит в том, чтобы скрыть расширения файлов. Общая структура веб-сайта выглядит следующим образом
root/ index.php login.php page1.php page2.php page3.php page4.php page5.php page6.php page7.php page8.php subfolder/ index.php validpage.php images/ css/
Папка подпапки в вышеуказанной структуре уникальна тем, что она является единственной вложенной папкой, содержащей php-файлы. Все остальные файлы находятся в корневой папке.
Я прошел через эти вопросы: Модируйте Rewrite и PHP, Mod-Rewrite или PHP-маршрутизатор? и mod_rewrite, php и файл .htaccess
Обновлен htaccess. благодаря @thomasmalt
RewriteEngine on RewriteBase / RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -f [OR] RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -d [OR] RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -l RewriteRule ^.*$ - [NC,L] # only rewrite if the requested file doesn't exist RewriteCond %{REQUEST_FILENAME} !-s # add .php to the url RewriteRule ^(.*)$ $1.php
Проблема теперь в том, что я получаю 500 вместо 404 ошибки, когда я пытаюсь получить доступ к несуществующей странице, например localhost / inex.php. Журнал ошибок Apache дает мне следующие ошибки. (Я обратился к localhost / index, который загрузил содержимое index.php, после чего я загрузил localhost / inex, что дало мне ошибку 500.)
[Sat Sep 25 14:44:26 2010] [error] [client 127.0.0.1] File does not exist: C:/wamp/www/index [Sat Sep 25 14:44:36 2010] [error] [client 127.0.0.1] Request exceeded the limit of 10 internal redirects due to probable configuration error. Use 'LimitInternalRecursion' to increase the limit if necessary. Use 'LogLevel debug' to get a backtrace.
Обновление : нашел ответ на мой вопрос здесь . Вопрос решен.
Я не совсем уверен, чего вы пытаетесь достичь, и я подозреваю, что не было никакого неуважения, что вам нужно понимать как mod_rewrite, так и то, как веб-сервер и php анализирует и выполняет файлы. Я не уверен, как ответить, не стреляя по вашему уровню понимания, но я попробую.
Я могу сказать вам, что вы используете .htaccess: (псевдокод)
if REQUEST_FILENAME does not exist then rewrite request to /index.php/<the request>
Поскольку index.php – это ваш скрипт php, который выполняется, и все, помеченное в $ 1, игнорируется. Вот почему index.php выполняется независимо от того, что вы делаете.
То, что вы могли бы попробовать добавить в свой .htaccess, это:
RewriteCond %{REQUEST_FILENAME} !-s RewriteRule ^(.*)$ $1.php
Это должно выполнить запрос и попытаться добавить .php в конец. К сожалению, я не тестировал его, но вы должны попробовать. Результат должен быть примерно таким:
if request is "/news/article" translate it to "/news/article.php"
И вы должны прочитать документацию mod_rewrite два раза в день в течение месяца и купить книгу O'Reilly о регулярных выражениях.
И если у вас есть доступ администратора к серверу разработки, вы должны изучить
RewriteLogLevel RewriteLog
У Apache есть опция: Options + MultiViews
Если вы включите это, вам не нужно размещать расширение файла в URL-адресе.
По опыту, это сложнее, чем кажется, чтобы ретро-mod_rewrite в существующий сайт.
Это связано не только с тем, что mod_rewrite сложно – на самом деле относительно легко настроить его и получить новые URL-адреса. Причина в том, что это сложно, потому что ваш существующий сайт будет иметь все старые URL-адреса, жестко закодированные в нем, поэтому вам придется пройти через свой код, изменив их все, чтобы указать на новый формат URL – это может быть особенно сложно, если ваш код строит строки URL динамически. Вам нужно будет провести много испытаний, чтобы убедиться, что вы выбрали все возможные варианты и что они все еще работают.
Также стоит упомянуть, что поисковые системы и внешние сайты будут иметь исторические ссылки на ваш сайт, используя старые URL-адреса, поэтому вы не сможете полностью их избавиться.
Я знаю, что это не отвечает на ваш вопрос, но я считаю, что это важные вещи, которые нужно рассмотреть, прежде чем начинать проект, потому что для существующего сайта это не быстрое исправление, которое некоторые люди делают.
RewriteBase /
что определяет базу по умолчанию … Если вы хотите оставаться в подпапке, просто создайте другой .htaccess в RewriteBase /subfolder/
с RewriteBase /subfolder/
или удалите ее вы можете сделать условие, как вы хотите
RewriteRule ^(([0-9]+)-)?page(-([0-9]+))?/?$ index.php?page=$2&id=$4 [L]
это займет у вас от www.abcd.com/2-page-3
до www.abcd.com/index.php?page=2&id=3
index.php
не должен содержать ничего.