Добавление mod-rewrite к существующему сайту PHP

Я обновляю приложение 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. 

Обновление : нашел ответ на мой вопрос здесь . Вопрос решен.

Solutions Collecting From Web of "Добавление mod-rewrite к существующему сайту PHP"

Я не совсем уверен, чего вы пытаетесь достичь, и я подозреваю, что не было никакого неуважения, что вам нужно понимать как 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-адреса, поэтому вы не сможете полностью их избавиться.

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

  1. Он отправляет вам root, потому что у вас есть RewriteBase / что определяет базу по умолчанию … Если вы хотите оставаться в подпапке, просто создайте другой .htaccess в RewriteBase /subfolder/ с RewriteBase /subfolder/ или удалите ее
  2. вы можете сделать условие, как вы хотите

     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

  1. Код в index.php не должен содержать ничего.