mod_rewrite для всех страниц (включая подпапки) сайта на одной странице php - PullRequest
3 голосов
/ 25 февраля 2011

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

Что у меня есть:

www.domain.com/index.html
www.domain.com/page.html?var=123&flag=true
www.domain.com/folder/subfolder/
www.domain.com/folder/subfolder/index.html
www.domain.com/folder/subfolder/new/test.html
www.domain.com/folder/subfolder/new/test.html?var=123&flag=true

То, что я хочу (мне также, вероятно, нужно urlencode путь) (передача полного URI тоже нормально):

www.domain.com/index.php?page=/index.html OR www.domain.com/index.php?page=www.domain.com/index.html
www.domain.com/index.php?page=/page.html?var=123&flag=true
www.domain.com/index.php?page=/folder/subfolder/
www.domain.com/index.php?page=/folder/subfolder/index.html
www.domain.com/index.php?page=/folder/subfolder/new/test.html
www.domain.com/index.php?page=/folder/subfolder/new/test.html?var=123&flag=true

Вот мой первый пример:

RewriteEngine On  # Turn on rewriting    
RewriteCond %{REQUEST_URI} .* # Do I even need this?    
^(.*)$ /index.php?page=$1

Идеи? Заранее спасибо:)

Edit:

Поэтому я попытался реализовать решение Ragnar, но получал 500 ошибок, когда я использовал 'RewriteCond $ 1' или включал '/' в последнюю строку. Я настроил файл test.php, который будет отображать GET _ ["page"], поэтому я знаю, что перезапись работает правильно. До сих пор я могу получить некоторые правильные результаты (но только когда я не в root), например:

RewriteEngine on
RewriteRule ^page/(.*)$ test.php?page=$1 [L]

Если я зайду на страницу http://www.domain.com/page/test/subdirectory/page.html?var=123, она выдаст «test / subdirectory / page.html» (пропуская строку запроса, которая мне нужна). Однако, если я использую этот пример:

RewriteEngine on
RewriteRule ^(.*)$ test.php?page=$1 [L]

Если я зайду http://www.domain.com/page/test/subdirectory/page.html?var=123, он выдаст только 'test.php', что сильно сбивает с толку. Мысли?

Редактировать # 2:

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

Options +FollowSymlinks
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /test.php

Затем в своем php-скрипте я могу использовать $ _SERVER ['REQUEST_URI'], чтобы получить то, что мне нужно. Я знал, что это должно было быть проще, чем то, что я пытался ...

Ответы [ 2 ]

2 голосов
/ 12 июля 2012

Нет необходимости в таком количестве строк, это только усложняет.

Все, что вам нужно, это 2 строки в .htaccess:

rewriteengine on
#rewriterule-: ar1 path =relative. ar2 if relative, that to rewritebase.
rewriterule !^foo/bar/index\.php$ /foo/bar/index.php
#..assert ar1 dismatches correct url

В PHP

Вы можете вывести первый ввод rewriterule в PHP, используя:

<?=$_SERVER['REQUEST_URI'];

Это даст вам всю мощь и позволит вам делать все.Просто проанализируйте $_SERVER["REQUEST_URI"] вручную, и вы можете echo совершенно разных страниц в зависимости от значения $_SERVER["REQUEST_URI"].


Sec ошибок

Обратите внимание, что вашсервер может выполнить поиск пути или глючить путь перед перезаписью.(Вы не можете изменить это поведение без привилегий сервера.) Например, если пользователь посещает /foo////, вы можете видеть только /foo/ или /foo.И, например, если пользователь посещает ///foo, вы можете видеть только /foo.И, например, если пользователь заходит /a/../foo, вы можете увидеть только /foo.И, например, если пользователь посещает /a//b/../../foo, вы можете видеть только /foo или /a/foo [потому что рабочие серверы с ошибками рассматривают множественные / как отличные в контексте .., без шуток ].


С разрывом цепи

Перезапись разрывов цепи на cin, идентичная htaccess ∙ parentfolder ∙ относительная интерпретируемая rewriterule ∙ arg2.(Во-первых, лично я отключил бы прерывания цепи, чтобы уменьшить сложность правил, но, кажется, нет никакого способа сделать это.)

Решение с прерыванием цепи:

rewriteengine on
#rewriterule-: ar1 path =relative. ar2 if relative, that to rewritebase.
rewriterule ^ /foo/bar/index.php
#..circuit-breaking, so assert ar2 if absolute, htaccess parentfolder =root, else, htaccess parentfolder not in interpreted ar2.

Разрыв цепи и перезапись на основе незапланированного использования

Для разрыва цепи необходимо:

  1. arg2 [of rewriterule] ⇌ абсолютный.и родительская папка htaccess ⇌ root.
  2. arg2 ⇌ относительный.и эта папка не в интерпретируемом arg2.

Так что, когда эта папка ≠ root, прерывание цепи требует arg2 ⇌ относительный.когда arg2 ⇌ относительный, для прерывания цепи требуется… эта папка ⇌ не в интерпретированном arg2⏋.

Скажем, нам нужен разрыв цепи и родительская папка htaccess, находящаяся в интерпретируемом arg2, поэтому мы редактируем arg2 через базу перезаписи:

rewriteengine on
#rewriterule-: ar1 path =relative. ar2 if relative, that to rewritebase.
rewriterule ^ bar/index.php
#..circuit-breaking, so assert ar2 if absolute, htaccess parentfolder =root, else, htaccess parentfolder not in interpreted ar2.
rewritebase /foo
#..needs to be absolute [</> starting]. pathing [eg </../a/..> and </../..///ran/dom-f/oobar/./././../../..////////.//.>] allowed
2 голосов
/ 26 февраля 2011

Я бы порекомендовал вам ознакомиться с Руководством по перезаписи URL Apache , в котором содержится обширная информация о перезаписи с примерами.

Если я вас правильно понимаю, вы сможете использовать что-то вроде этого

RewriteEngine on
RewriteCond $1 
RewriteRule ^(.*)$ index.php/?page=$1 [L]

Какой код очень похож на тот, который вы опубликовали. Если вам нужна более качественная информация, сообщите о своей проблеме.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...