Не можете получить доступ к $ _GET после перезаписи? - PullRequest
0 голосов
/ 20 августа 2011

Вот часть mod_rewrite моего .htaccess

Options +FollowSymlinks

Options -Indexes

# Prevent Direct Access to files
<FilesMatch "\.(tpl|ini)">
 Order deny,allow
 Deny from all
</FilesMatch>

# SEO URL Settings
RewriteEngine On
RewriteBase /mysite/

# Protects file paths
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /mysite/index.php?route=$1 [NC,QSA,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/(.*)$ /mysite/index.php?route=$1&page=$2 [NC,QSA,L]

</IfModule>

Когда я набираю http://localhost/mysite/home, он правильно переводит меня на index.php?route=home.

Когда я печатаю http://localhost/mysite/services/снова работает, и я могу правильно получить доступ к $_GET['route']

, так, например, мое меню имеет:

<li<?php if($_GET['route'] == 'home') { echo ' class="selected"'; ?>>

, чтобы установить класс на этой странице.

но ....

Когда я набираю http://localhost/mysite/services/widget, это корректно переводит меня на index.php?route=home&page=widget, но я получаю ошибку PHP, если пытаюсь сослаться на $_GET['page'] (или ЛЮБОЕ $_GET значение в этом отношении) ... которое, как я упоминал ранее, я использовал для установки класса selected пункта меню.

Может кто-нибудь помочь мне исправить это?Должно быть, я сделал что-то не так со вторым rewriterule ... потому что он не принимает значения $_GET.

...

Это действительно странно, потому что я использую $_GET['route'] и $_GET['page'], чтобы заполнить правильный HTML-код для страницы (аналогично настройке MVC) ... Я бы подумал, что php include, который у меня есть на index.php, не будет выполнен, если он не сможет найти$_GET

....

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

Возможно, это уместно, но мой код index.php выглядит следующим образом:

if( isset( $_GET[ 'route' ] )) {
    if( file_exists( 'content/' . $_GET[ 'route' ] . '.php' )) {
      if( isset( $_GET[ 'page' ] )) {
        if( file_exists( 'content/' . $_GET[ 'route' ] . '/' . $_GET[ 'page'] . '.php' )) {
          include 'content/' . $_GET[ 'route' ] . '/' . $_GET[ 'page'] . '.php';
        }
      } else {
        include 'content/' . $_GET[ 'route' ] . '.php'; 
      }
    } else {
      header( "Location:404" );
      exit;
    }
  } else {
    header( "Location:home" );
    exit;
  }

Ответы [ 3 ]

2 голосов
/ 20 августа 2011

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

RewriteBase /mysite

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/(.*)$ /mysite/index.php?route=$1&page=$2 [NC,QSA,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /mysite/index.php?route=$1 [NC,QSA,L]

И убедитесь, что у вас есть вышеуказанный код в файле mysite / .htacess.

С вышеупомянутым, если вы посетите http://localhost/mysite/services/widget и выполните print_r($_GET);, вы получите:

Array
(
    [route] => services
    [page] => widget
)
2 голосов
/ 20 августа 2011

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

0 голосов
/ 20 августа 2011

Странно. Если ваши URL GET присутствуют в URL-адресе, PHP сможет их получить. Попробуйте сложить свои переписки так и посмотрите, поможет ли это:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/(.*)$ index.php?route=$1&page=$2 [NC,QSA,L]
RewriteRule ^(.*)$ index.php?route=$1 [NC,QSA,L]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...