2010-09-24 3 views
0

Я обновляю приложение php, которое в настоящее время не использует переписывание URL. Цель состоит в том, чтобы скрыть расширения файлов. Общая структура сайта выглядит следующим образомДобавление mod-rewrite к существующему сайту PHP

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 files.All из других файлов в корневой папке.

Я через эти вопросы Mod Rewrite and PHP и Mod-Rewrite or PHP router? и mod_rewrite, php and the .htaccess file

Обновлено 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 дает мне следующие ошибки. (I доступ LOCALHOST/индекс, который загружается содержимое 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. 

Update: нашел ответ на мой вопрос here. Вопрос решен.

+1

Слишком сложно понять, чего вы пытаетесь достичь со своего поста, и это слишком долго. Вы должны рассмотреть возможность его переписывания для уточнения. – thomasmalt

+0

@thomasmalt: Я переписал вопрос перезаписи – abel

ответ

2

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

Я могу вам сказать, что вы тока .htaccess делают: (псевдокод)

if REQUEST_FILENAME does not exist then 
    rewrite request to /index.php/<the request> 

Поскольку index.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 
+0

спасибо @thomasmalt. Я ценю это. Я пробовал читать http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html, но не полностью понял его. :) и спасибо за псевдокод. – abel

+0

правило работает как шарм. однако он не обрабатывает имена папок очень хорошо. если я пытаюсь получить доступ к localhost/или localhost/subfolder/i, получите ошибку 500. все, что я могу сделать для этого. – abel

+0

@abel да. Самое простое, что вы можете сделать с вашей текущей настройкой: установить RewriteCond% {DOCUMENT_ROOT}% {REQUEST_URI} -f [OR] RewriteCond% {DOCUMENT_ROOT}% {REQUEST_URI} -d [OR] RewriteCond% {DOCUMENT_ROOT}% { REQUEST_URI} -l RewriteRule ^. * $ - [NC, L] в начале вашей конфигурации mod_rewrite (каждый cond и правило в собственной строке) – thomasmalt

1
  1. Он пошлет вас к корню, потому что у вас есть RewriteBase /, что определяющее по умолчанию базу ... Если вы хотите, чтобы остаться в подпапке просто сделать еще один .htaccess в подкаталоге с 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 не должен содержать ничего.
+0

спасибо за ответ. Я читал что-то в других подобных вопросах о stackoverflow, в котором говорилось, что лучше разрешить php обрабатывать перенаправление, а перенаправлять каждую страницу на index.php. и я обновил вопрос. – abel

1

Из опыта это сложнее, чем кажется, чтобы ретро-образный mod_rewrite в существующий сайт.

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

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

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

3

Apache имеет опцию: Options + MultiViews

Если вы включите это, вам не нужно поместить расширение файла в URL-адресе.

+1

Ох. Отличный ответ. Я голосую за вас, как ракета :) - http://httpd.apache.org/docs/2.2/content-negotiation.html – thomasmalt

+0

будет ли это работать на хостинге Hostgator? – abel

+1

Только один способ понять это: попробуйте на Hostgator. – VeeWee

Смежные вопросы