.htaccess не работает на всех ссылках - PullRequest
2 голосов
/ 04 мая 2011

У меня есть два образца URL на моем новом сайте.

  1. sample1: http://localhost/phone/3
  2. sample2: http://localhost/phone/3/10

обратите внимание: телефон - это название проекта

И я сам написал файл htaccess, но он работает только с sample1.

Options +FollowSymLinks
RewriteEngine On

#RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^(.*)$ index.php?menu=$1 [L]

Мне нужна версия, которая работает на обоих примерах. Любая помощь будет оценена.

Ответы [ 4 ]

3 голосов
/ 04 мая 2011

Используйте это:

RewriteRule phone/([^/]+)$ /index.php?menu=$1
RewriteRule phone/([^/]+)/([^/]+)$ /index.php?menu=$1&some=$2

Или, если ваши параметры всегда целые:

RewriteRule phone/([0-9]+)$ /index.php?menu=$1
RewriteRule phone/([0-9]+)/([0-9]+)$ /index.php?menu=$1&some=$2
3 голосов
/ 04 мая 2011

Я предлагаю вам использовать ([^ /] +) вместо (. *)

Разница в том, что ([^ /] +) не включает косую черту.(. *) терпит неудачу, когда у вас есть URL, который заканчивается косой чертой.Например:

home/([^/]+)/?$ index.php?menu=$1 

будет отлично работать для

sitename.com/home/contact

и

sitename.com/home/contact/

, вы получите $ _GET ['menu'], содержащий контакт соба URL.С (. *) Второй будет содержать контакт /, поэтому с косой чертой.

, заканчивающийся на /? $, Означает, что конечный / необязателен в конце.

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

полный код в формате htaccess:

RewriteEngine on 
RewriteRule ^phone/([^/]+)/?$ index.php?menu=$1
RewriteRule ^phone/([^/]+)/([^/]+)/?$ index.php?menu=$1&var2=$2
2 голосов
/ 04 мая 2011
RewriteRule ^(.*)$ /index.php?menu=$1
RewriteRule ^(.*)/(.*)$ /index.php?menu=$1&some=$2

ОБНОВЛЕНО Снова

Options +FollowSymLinks
RewriteBase /phone
RewriteEngine On    
RewriteCond %{REQUEST_FILENAME} !-f # Do not rewrite static files
RewriteCond %{REQUEST_FILENAME} !-d # Do not rewrite static directories
RewriteRule ^(.*)$ /index.php?menu=$1
RewriteRule ^(.*)/(.*)$ /index.php?menu=$1&some=$2

Попробуйте это

1 голос
/ 04 мая 2011

Это должно делать то, что вы хотите:

Options +FollowSymLinks
RewriteEngine On

RewriteBase /phone/

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^(.*?)/?$ index.php?menu=$1 [L]
RewriteRule ^(.*?)/(.*?)/?$ index.php?menu=$1&submenu=$2 [L]

// ИЛИ следующее, если значения всегда будут целыми числами (это лучший способ)

Options +FollowSymLinks
RewriteEngine On

RewriteBase /phone/

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^([0-9]+)/?$ index.php?menu=$1 [L]
RewriteRule ^([0-9]+)/([0-9]+)/?$ index.php?menu=$1&submenu=$2 [L]
RewriteRule ^(.*?)/(.*?\.js)$ /phone/js/$2 [L] #Makes JS static content work
RewriteRule ^(.*?)/(.*?\.css)$ /phone/css/$2 [L] #Makes CSS static content work

Я бы не рекомендовал использовать (. *?). Лучше быть конкретным, что вы хотите, чтобы значение было.

Абсолютные пути будут лучше, чем статические.

Статический путь

<script src="script.js" type="text/javascript"></script>

Абсолютный Путь

<script src="http://localhost/phone/script.js" type="text/javascript"></script>

Если вы беспокоитесь и переносимости вы можете создать файл настроек, с этим в:

define("WWW_DOMAIN", "http://localhost/phone/");

Используйте это в верхней части каждой страницы как:

А затем сделайте:

<script src="<?php echo WWW_DOMAIN;?>script.js" type="text/javascript"></script>

Сделайте веб-сайт проще для разработки, прежде чем перемещать его на другой сервер. Тогда все, что вам нужно сделать, это один раз изменить WWW_DOMAIN.

Может быть проще, чем делать это с помощью htaccess.

...