Multiple slashes in URI

dakata__92

Super Moderator
Драснах си едно правило в .htaccess но не успявам да се справя с множеството ///// наклонени черти, при въвеждане в адреса. Нека пренасочва ако е възможно към еденични или да връща някакъв ерор... Принципно най-бързото и приятно решение търся. Това е кода:
Код:
RewriteEngine On
RewriteBase /dph/ccf/public/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^(.+)$ index.php?uri=$1 [QSA,L]
 
Защо пренаписваш към ?url= ? Ами ако адреса ти е /some/action?get=parameter ще стане на index.php?url=some/action?get=parameter

Ето какво ползвам аз:

Код:
<IfModule mod_rewrite.c>
    RewriteEngine On
    # Redirect Trailing Slashes...
    RewriteRule ^(.*)/$ /$1 [L,R=301]
    # Handle Front Controller...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ /index.php [L]
</IfModule>
 
djman каза:
Защо пренаписваш към ?url= ? Ами ако адреса ти е /some/action?get=parameter ще стане на index.php?url=some/action?get=parameter

Ето какво ползвам аз:

Код:
<IfModule mod_rewrite.c>
    RewriteEngine On
    # Redirect Trailing Slashes...
    RewriteRule ^(.*)/$ /$1 [L,R=301]
    # Handle Front Controller...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ /index.php [L]
</IfModule>

Ами принципно това ми е клас рутер... Ако има по-добър варянт кажи ми го:
PHP:
class Router{
    private $_uri = array();
	
	public function __construct(){       
    }
    
	public function add($uri,$class = null){
		$uri = strtolower(trim(trim($uri),'/'));
		$this->_uri[$uri.'/'] = $class;
	}
	
	public function run(){
		$uri = isSet($_GET['uri']) ?  strtolower($_GET['uri']) : '/';
		if(isSet($this->_uri[$uri])){
			echo $this->_uri[$uri];
		}else{
			throw new \Exception('Not found [$uri]!', 404);
		}
	}
	

}
 
Код:
RewriteEngine On
RewriteBase /dph/ccf/public/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^(.+)$ ?$1 [QSA,L]
Така по-добре ли е?

В рутера ползвам вече echo $uri = isSet($_SERVER['QUERY_STRING']) ? strtolower($_SERVER['QUERY_STRING']) : '/';
 
dakata__92 каза:
Код:
RewriteEngine On
RewriteBase /dph/ccf/public/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^(.+)$ ?$1 [QSA,L]
Така по-добре ли е?

В рутера ползвам вече echo $uri = isSet($_SERVER['QUERY_STRING']) ? strtolower($_SERVER['QUERY_STRING']) : '/';

Трябва ли все с редирект 301 да ги прихващам и пренасочвам.... :idea:
 
да, използвай query string. А може и request uri. Напиши print_r $_SERVER и експериментирай. Но да ползваш get параметът не е добро решение ми се струва.

Колкото за редирект - ако не 301, какво? Направи си програмата така, че никъде да няма връзка с trailing slash. Ако някой си играе - пренасочва.
 
djman каза:
Просто в самият рутер засичам и пренасочвам. :)
PHP:
$uri = !empty($_SERVER['QUERY_STRING']) ?  strtolower($_SERVER['QUERY_STRING']) : '/';
		$uri = str_replace('&','?',$uri);
		if(stripos($_SERVER['REQUEST_URI'],'//') !== false){
			$request = preg_replace('~/{2,}~', '/', $_SERVER['REQUEST_URI']);
			header('Location:'.__DIR__.$request );
		}
 
djman каза:
Защо избра това решение?)
Защото като цяло, ако htacces ми пренасочва тези неща ще има бъдещо несъответствие с рутера и браузерите ще си пренасочват към старата страница, докато така самият рутер ми засича този проблем и го отстранява. Въпрос на виждане, но най-вече при бъдещи промени ако се налага във фрейма вероятността да се запамети Редирект 301 в браузерът на юзъра е по-малка. :)
 

Back
Горе