কৌণিক জেএস '#' ছাড়া রাউটিং করছে


223

আমি অ্যাঙ্গুলারজেএস শিখছি এবং একটি জিনিস আছে যা আমাকে সত্যই বিরক্ত করে।

আমি $routeProviderআমার আবেদনের জন্য রাউটিং বিধিগুলি ঘোষণা করতে ব্যবহার করি:

$routeProvider.when('/test', {
  controller: TestCtrl,
  templateUrl: 'views/test.html'
})
.otherwise({ redirectTo: '/test' });

তবে আমি যখন ব্রাউজারে আমার অ্যাপ্লিকেশন নেভিগেট করি তখন আমি app/#/testতার পরিবর্তে দেখতে পাচ্ছি app/test

সুতরাং আমার প্রশ্ন হ'ল কেন AngularJS #ইউআরএলগুলিতে এই হ্যাশ যুক্ত করে? এটি এড়ানোর কোনও সম্ভাবনা আছে কি?


2
আপনি যদি কৌনিক 1.6 ব্যবহার করেন তবে সমাধানটি এখানে ।
মিস্তালিস

উত্তর:


265

আসলে আপনার এইচটিএমএল 5 ব্রাউজারগুলির জন্য # (হ্যাশট্যাগ) প্রয়োজন।

অন্যথায় তারা কেবল উল্লিখিত href এ সার্ভারে একটি HTTP কল করবে। # টি হ'ল একটি পুরানো ব্রাউজার শর্টকার্টকিট যা অনুরোধটিকে অগ্রাহ্য করে না, যা অনেক জেএস ফ্রেমওয়ার্কগুলিকে তার নিজস্ব ক্লায়েন্টসাইডের উপরে পুনঃপ্রকাশ করতে দেয় allows

আপনি $locationProvider.html5Mode(true)যদি উপলব্ধ থাকে তবে এইচটিএমএল 5 কৌশল ব্যবহার করতে কৌনিকটি বলতে ব্যবহার করতে পারেন ।

এখানে ব্রাউজারের তালিকা যা HTML5 কৌশল সমর্থন করে: http://caniuse.com/#feat=history


4
ঠিক আছে ধন্যবাদ. এটাই আমার সন্দেহ হয়েছিল। তবে আমার পক্ষে এটি বেশ ব্যবহারকারী-বন্ধুত্বপূর্ণ! যাক যাক আমি চাই যে কিছু সংস্থান url, অ্যাপ / রিসোসের মাধ্যমে উপলভ্য হোক। আমার সাইটের ব্যবহারকারীরা কীভাবে এটি আবিষ্কার করতে পারেন যে পরিবর্তে তাদের অ্যাপ্লিকেশন / # / পুনরায় টাইপ করা উচিত?
pikkvile

5
তবে যদি তা হয় তবে লোকেশন বারে দৃশ্যমান হওয়ার জন্য আমার কেন এই পাথগুলি দরকার? যদি ব্যবহারকারীরা সেগুলি ব্যবহার না করে তবে আমি কেবল একক পৃষ্ঠার জাভাস্ক্রিপ্ট অ্যাপ্লিকেশন তৈরি করতে পারি।
pikkvile

6
আপনি যখন অ্যাপ্লিকেশনের স্থিতি রাখতে চান তখন এটি দরকারী। ফ্রেমওয়ার্কগুলি একটি ইতিহাস প্রক্রিয়া সরবরাহ করে। অতিরিক্ত হিসাবে, এটি উদাহরণস্বরূপ url ভাগ করে নেওয়ার মাধ্যমে আপনার আবেদনের স্থিতির সরাসরি অ্যাক্সেসের অনুমতি দেয়
আরও-

6
এইচটিএমএল 5 ইতিহাস এপিআই সমর্থন করে এমন আধুনিক ব্রাউজারগুলিতে হ্যাশট্যাগের প্রয়োজন নেই। @ চালকের উত্তর এবং প্রদত্ত লিঙ্কগুলি দেখুন। এইচটিএমএল 5 মোডে, কৌনিকটি ব্রাশ ব্রাউজার সমর্থন না করলে কেবল হ্যাশট্যাগ ব্যবহার করবে। আরও মনে রাখবেন, আপনি না চাইলে আপনাকে $ রুটপ্রোভাইডার ব্যবহার করতে হবে না ... আপনি এনজি-ক্লিকগুলি ব্যবহার করে নিজস্ব রাউটিংটি ওয়্যার আপ করতে পারেন এবং এনজি-অন্তর্ভুক্ত করতে পারেন (আসলে আপনার যদি একাধিক স্তরের প্রয়োজন হয় তবে এটি করতে হবে রাউটিং, যেহেতু এনজি-ভিউ প্রতি পৃষ্ঠায় কেবল একবার উপস্থিত হতে পারে)। আরও দেখুন stackoverflow.com/questions/12793609/...
মার্ক Rajcok

2
Hashbang / pushstate / সার্ভার সাইড রেন্ডারিং HTML ক্ষেত্রে জন্য, টুইটার এক পড়তে চমত্কার সুন্দর engineering.twitter.com/2012/12/... এটা কিভাবে তারা এটা করতে পরিচালিত তাই এটি পুরানো ব্রাউজার দিয়ে এবং সার্চ সঙ্গে সামঞ্জস্যপূর্ণ অনগ্রসর এর ইঞ্জিন। আমি জানি এটি কৌণিক সুনির্দিষ্ট নয় তবে আপনি প্রবাহটি পুনরুত্পাদন করতে পারেন।
jackdbernier

47

যদি আপনি এইচটিএমএল 5 মডেলটিকে অন্যদের যেমন বলেছে তেমন সক্ষম করে থাকেন এবং .htaccessনিম্নলিখিত বিষয়বস্তুগুলির সাথে একটি ফাইল তৈরি করেন (আপনার প্রয়োজনের জন্য সামঞ্জস্য করুন):

RewriteEngine   On
RewriteBase     /
RewriteCond     %{REQUEST_URI} !^(/index\.php|/img|/js|/css|/robots\.txt|/favicon\.ico)
RewriteCond     %{REQUEST_FILENAME} !-f
RewriteCond     %{REQUEST_FILENAME} !-d
RewriteRule     ./index.html [L]

ব্যবহারকারীরা যখন কোনও যথাযথ রুটে প্রবেশ করেন তখন আপনার অ্যাপ্লিকেশনটিতে পরিচালিত হবে এবং আপনার অ্যাপটি রুটটি পড়বে এবং এগুলির মধ্যে সঠিক "পৃষ্ঠায়" আনবে।

সম্পাদনা: আপনার রুটের সাথে কোনও ফাইল বা ডিরেক্টরি নামের বিরোধী না হওয়ার বিষয়টি নিশ্চিত করুন।


এর কোন এনগিনেক্স ভার্সন আছে? আমি যখন /aboutঅ্যাপ্লিকেশনটির মাধ্যমে না আসি তবে পৃষ্ঠাটি লোড করা ব্যর্থ হয়।
chovy

কখনও তাদের ব্যবহৃত হয়েছে, কিন্তু এই চেষ্টা: stackoverflow.com/questions/5840497/convert-htaccess-to-nginx
bearfriend

3
@ চিভি - এখানে এনজিন্স সংস্করণ চলেছে: সার্ভার {সার্ভার_আমার-অ্যাপ্লিকেশন; মূল / পথ / থেকে / অ্যাপ্লিকেশন; অবস্থান / {try_files $ uri $ uri / /index.html; }}
হায়দার

4
মনে রাখবেন <বেস href = "/"> </
b>>

ধন্যবাদ! এটি ছাড়া গভীর সংযোগ স্থাপন অসম্ভব। আমি এখনও নিশ্চিত নই যে আপনার গভীর লিঙ্কিংয়ের প্রয়োজন হলে বিশেষত কিছু মেঘ / প্যাস পরিবেশে আপনার যদি httpd কনফিগারেশনে সহজ অ্যাক্সেস নাও থাকে তবে প্রাকৃতিকতা বা ইউআরআইগুলি এটি বজায় রাখতে সমস্যাটি উপযুক্ত।
পিয়েরে হেনরি

39

সহজ এবং সংক্ষিপ্ত দেখাচ্ছে এমন উত্তর লিখতে দিন

শেষে রাউটারে html5Mode (সত্য) যুক্ত করুন ;

app.config(function($routeProvider,$locationProvider) {

    $routeProvider.when('/home', {
        templateUrl:'/html/home.html'
    });

    $locationProvider.html5Mode(true);
})

এইচটিএমএল হেডে বেস ট্যাগ যুক্ত করুন

<html>
<head>
    <meta charset="utf-8">    
    <base href="/">
</head>

ধন্যবাদ @ প্লাস - উপরের উত্তরটি বিশদ দেওয়ার জন্য


আমি এটি কাজ করতে সক্ষম হইনি। আমি আমার সুনির্দিষ্ট বিবরণ সহ একটি নতুন প্রশ্ন এখানে পোস্ট করেছি: stackoverflow.com/questions/36041074/… দয়া করে এটি দেখুন এবং আপনি যদি সহায়তা করতে পারেন তবে আমি এটির প্রশংসা করব।
ল্যারি মার্টেল

30

চেষ্টা

$locationProvider.html5Mode(true)

$ অবস্থানপ্রভাইডার $ অবস্থান ব্যবহার করে আরও তথ্য


6
দুঃখিত আমি যোগ করেছি। কনফিগ (ফাংশন ($ লোকেশনপ্রভাইডার) {$ লোকেশনপ্রভাইডার এইচটিএমএল 5 মডেল (সত্য)})) তবে আমার ফলাফল হ'ল সূচী। html #% 2Fodome.html / home নয়
zloctb 11:59

12

নিম্নলিখিত তথ্যগুলি হ'ল: https://scotch.io/quick-tips/ ব্যাখ্যাty-urls-in-angularjs-removing- the-
hashtag

পরিষ্কার ইউআরএল পাওয়া এবং কৌণিক URL থেকে হ্যাশট্যাগটি সরিয়ে ফেলা খুব সহজ।
ডিফল্টরূপে, AngularJS উদাহরণগুলির জন্য একটি হ্যাশট্যাগ দিয়ে URL গুলি রুট করবে:

এখানে 2 টি জিনিস করা দরকার।

  • $ অবস্থানপ্রভাইডার কনফিগার করা হচ্ছে

  • আপেক্ষিক লিঙ্কগুলির জন্য আমাদের বেস সেট করা হচ্ছে

  • $ অবস্থান পরিষেবা

কৌণিকর মধ্যে, $ অবস্থানের পরিষেবা ঠিকানা বারে ইউআরএলকে বিশ্লেষণ করে এবং আপনার অ্যাপ্লিকেশনটিতে এবং তার বিপরীতে পরিবর্তন করে।

লোকেশন পরিষেবা এবং এটি কী সরবরাহ করে তা অনুভব করার জন্য আমি আনুষ্ঠানিক কৌণিক $ লোকেশন ডক্সের মাধ্যমে পড়ার সুপারিশ করব।

https://docs.angularjs.org/api/ng/service/$location

P অবস্থানপ্রবাহক এবং এইচটিএমএল 5 মোড

  • আমরা $ লোকেশনপ্রাইডার মডিউলটি ব্যবহার করব এবং এইচটিএমএল 5 মডেলটি সত্য হিসাবে সেট করব।
  • আপনার কৌনিক অ্যাপ্লিকেশনটি সংজ্ঞায়িত করার সময় এবং আপনার রুটগুলি কনফিগার করার সময় আমরা এটি করব।

    angular.module('noHash', [])
    
    .config(function($routeProvider, $locationProvider) {
    
       $routeProvider
           .when('/', {
               templateUrl : 'partials/home.html',
               controller : mainController
           })
           .when('/about', {
               templateUrl : 'partials/about.html',
               controller : mainController
           })
           .when('/contact', {
               templateUrl : 'partials/contact.html',
               controller : mainController
           });
    
       // use the HTML5 History API
       $locationProvider.html5Mode(true); });

এইচটিএমএল 5 ইতিহাস এপিআই কি? স্ক্রিপ্টটি ব্যবহার করে ব্রাউজারের ইতিহাসটি ম্যানিপুলেট করার এটি একটি মানসম্পন্ন উপায়। এটি কৌনিকটি পৃষ্ঠাটিকে রিফ্রেশ না করে আমাদের পৃষ্ঠাগুলির রাউটিং এবং URL গুলি পরিবর্তন করতে দেয় change এ সম্পর্কে আরও তথ্যের জন্য, এখানে একটি ভাল এইচটিএমএল 5 ইতিহাস এপিআই নিবন্ধ:

http://diveintohtml5.info/history.html

আপেক্ষিক লিঙ্কগুলির জন্য সেট করা

  • আপেক্ষিক লিঙ্কগুলি ব্যবহার করে আপনার অ্যাপ্লিকেশনটির চারপাশে লিঙ্ক <base>করার <head>জন্য আপনাকে আপনার নথির মধ্যে সেট করতে হবে । এটি আপনার অ্যাংুলার অ্যাপ্লিকেশনটির রুট ইনডেক্স html ফাইলে থাকতে পারে। <base>ট্যাগটি সন্ধান করুন এবং আপনার অ্যাপ্লিকেশানের জন্য আপনি যে মূল URLটি চান তা সেট করুন।

উদাহরণ স্বরূপ: <base href="https://stackoverflow.com/">

  • এটি কনফিগার করার জন্য প্রচুর অন্যান্য উপায় রয়েছে এবং এইচটিএমএল 5 মোডে সত্য সেট করা স্বয়ংক্রিয়ভাবে সম্পর্কিত লিঙ্কগুলি সমাধান করা উচিত। যদি আপনার অ্যাপ্লিকেশনটির মূলটি ইউআরএল থেকে পৃথক হয় (উদাহরণস্বরূপ / আমার-বেস, তবে এটি আপনার বেস হিসাবে ব্যবহার করুন।

পুরানো ব্রাউজারগুলির জন্য ফলব্যাক

  • $ অবস্থান পরিষেবাটি স্বয়ংক্রিয়ভাবে ব্রাউজারগুলির জন্য হ্যাশবাং পদ্ধতিতে ফ্যালব্যাক হবে যা এইচটিএমএল 5 ইতিহাস এপিআই সমর্থন করে না।
  • এটি আপনার কাছে স্বচ্ছভাবে ঘটে এবং এটি কাজ করার জন্য আপনাকে কোনও কনফিগার করতে হবে না। কৌণিক $ অবস্থানের ডক্স থেকে আপনি ফ্যালব্যাক পদ্ধতি এবং এটি কীভাবে কাজ করে তা দেখতে পারেন।

উপসংহারে

  • চমত্কার ইউআরএলগুলি পাওয়া এবং আপনার কৌণিক অ্যাপ্লিকেশনটিতে হ্যাশট্যাগ সরানোর এটি সহজ উপায় way যারা সুপার ক্লিন এবং সুপার দ্রুত কৌণিক অ্যাপ্লিকেশন তৈরি করতে মজা করুন!

3

আপনি যদি এপাচে অ্যাঙ্গুলার পরিবেশন করে ওএস এক্স 10.8 এ স্থানীয়ভাবে এটি কনফিগার করতে চান তবে আপনার .htaccess ফাইলটিতে নিম্নলিখিতগুলি খুঁজে পেতে পারে:

<IfModule mod_rewrite.c>
    Options +FollowSymlinks
    RewriteEngine On
    RewriteBase /~yourusername/appname/public/
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_URI} !.*\.(css|js|html|png|jpg|jpeg|gif|txt)
    RewriteRule (.*) index.html [L]
</IfModule>

অপশন + ফলোসিম্লিংকস সেট না করা থাকলে আপনাকে এই জাতীয় লগগুলিতে নিষিদ্ধ ত্রুটি দিতে পারে:

Options FollowSymLinks or SymLinksIfOwnerMatch is off which implies that RewriteRule directive is forbidden

পুনর্লিখনের ভিত্তিতে প্রয়োজনীয় অন্যথায় অনুরোধগুলি আপনার সার্ভারের মূলের কাছে সমাধান হবে যা স্থানীয়ভাবে ডিফল্টরূপে আপনার প্রকল্প ডিরেক্টরি নয় যদি আপনি নির্দিষ্টভাবে আপনার vhosts কনফিগার না করে থাকেন, সুতরাং আপনাকে অনুরোধটি আপনার প্রকল্পের মূল ডিরেক্টরিটি সন্ধান করতে পারে তাই আপনাকে পথ নির্ধারণ করতে হবে। উদাহরণস্বরূপ আমার মেশিনে আমার একটি / ব্যবহারকারী / আমার / সাইট ডিরেক্টরি রয়েছে যেখানে আমি আমার সমস্ত প্রকল্প রাখি। পুরানো ওএস এক্সের মতো সেট আপ করুন।

পরবর্তী দুটি লাইন কার্যকরভাবে বলে যে পথটি কোনও ডিরেক্টরি বা কোনও ফাইল না হলে আপনার অ্যাপ্লিকেশন রুটের পাথের মতো কোনও ফাইল বা ডিরেক্টরি নেই বলে নিশ্চিত করতে হবে।

পরের শর্তটি বলে যে যদি অনুরোধটি ফাইলের এক্সটেনশনগুলির সাথে নির্দিষ্ট না হয়ে থাকে তবে আপনার যা প্রয়োজন সেখানে যুক্ত করুন

এবং [এল] শেষটি সূচকটি এইচটিএমএল ফাইল পরিবেশন করতে বলছে - অন্য সমস্ত অনুরোধের জন্য আপনার অ্যাপ্লিকেশন।

যদি আপনার এখনও সমস্যা হয় তবে অ্যাপাচি লগটি পরীক্ষা করুন, এটি সম্ভবত আপনাকে দরকারী ইঙ্গিত দেবে:

/private/var/log/apache2/error_log

আপনি যদি লোকালহোস্ট অ্যাপাচি সার্ভার হিসাবে এমএএমপি ব্যবহার করেন তবে নিশ্চিত হয়ে নিন যে প্রথম রেভারাইটবেসটি কোনও আপেক্ষিক লিঙ্ক। উদাহরণস্বরূপ RewritBase / angularjs_site_folder /
ডেভিড ডগলাস

3

এইচটিএমএল 5 মোড ব্যবহার করার জন্য সার্ভার সাইডে ইউআরএল পুনর্লিখনের প্রয়োজন হয়, মূলত আপনাকে আপনার অ্যাপ্লিকেশনের এন্ট্রি পয়েন্টে (যেমন সূচক। Html) আপনার সমস্ত লিঙ্ক পুনর্লিখন করতে হবে। <base>এই ক্ষেত্রে একটি ট্যাগের প্রয়োজনও গুরুত্বপূর্ণ, কারণ এটি AngularJS- কে ইউআরএল অংশের মধ্যে পার্থক্য করতে দেয় যা অ্যাপ্লিকেশন বেস এবং অ্যাপ্লিকেশনটির দ্বারা পরিচালিত হওয়া সেই পথের মধ্যে পার্থক্য করতে পারে। আরও তথ্যের জন্য, AngularJS বিকাশকারী গাইড - অবস্থান HTML5 মোড সার্ভার সাইড ব্যবহার করে দেখুন


হালনাগাদ

কীভাবে: এইচটিএমএল 5 মডেল 1 এর সাথে কাজ করতে আপনার সার্ভারটি কনফিগার করুন

আপনি যখন এইচটিএমএল 5 মোড সক্ষম করেছেন, #অক্ষরটি আর আপনার ইউআরএলে ব্যবহৃত হবে না। #কারণ এটির কোনো সার্ভার প্রান্তের কনফিগারেশন প্রয়োজন প্রতীক দরকারী। ছাড়া #, ইউআরএলটি দেখতে খুব সুন্দর দেখাচ্ছে তবে এটির জন্য সার্ভারের সাইড পুনর্লিখনগুলিও প্রয়োজন। এখানে কিছু উদাহরন:

অ্যাপাচি পুনর্লিখন

<VirtualHost *:80>
    ServerName my-app

    DocumentRoot /path/to/app

    <Directory /path/to/app>
        RewriteEngine on

        # Don't rewrite files or directories
        RewriteCond %{REQUEST_FILENAME} -f [OR]
        RewriteCond %{REQUEST_FILENAME} -d
        RewriteRule ^ - [L]

        # Rewrite everything else to index.html to allow html5 state links
        RewriteRule ^ index.html [L]
    </Directory>
</VirtualHost>

এনগিনেক্স পুনর্লিখন

server {
    server_name my-app;

    index index.html;

    root /path/to/app;

    location / {
        try_files $uri $uri/ /index.html;
    }
}

আজুর আইআইএস পুনর্লিখন

<system.webServer>
  <rewrite>
    <rules> 
      <rule name="Main Rule" stopProcessing="true">
        <match url=".*" />
        <conditions logicalGrouping="MatchAll">
          <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
          <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
        </conditions>
        <action type="Rewrite" url="/" />
      </rule>
    </rules>
  </rewrite>
</system.webServer>

পুনর্লিখন এক্সপ্রেস

var express = require('express');
var app = express();

app.use('/js', express.static(__dirname + '/js'));
app.use('/dist', express.static(__dirname + '/../dist'));
app.use('/css', express.static(__dirname + '/css'));
app.use('/partials', express.static(__dirname + '/partials'));

app.all('/*', function(req, res, next) {
    // Just send the index.html for other files to support HTML5Mode
    res.sendFile('index.html', { root: __dirname });
});

app.listen(3006); //the port you want to use

আরো দেখুন


1

কৌণিক 6 এ, আপনার রাউটার দিয়ে আপনি ব্যবহার করতে পারেন:

RouterModule.forRoot(routes, { useHash: false })

0

আপনি মূল পৃষ্ঠাতে (হোম) পুনঃনির্দেশ করতে নীচের কোডটিও ব্যবহার করতে পারেন:

{ path: '', redirectTo: 'home', pathMatch: 'full'}

উপরে হিসাবে আপনার পুনর্নির্দেশ নির্দিষ্ট করার পরে, আপনি অন্যান্য পৃষ্ঠাগুলি পুনঃনির্দেশ করতে পারেন, উদাহরণস্বরূপ:

{ path: 'add-new-registration', component: AddNewRegistrationComponent},
{ path: 'view-registration', component: ViewRegistrationComponent},
{ path: 'home', component: HomeComponent}

0

**

এটি কৌণিক অবস্থানের কৌশল হিসাবে এইচটিএমএল 5 স্টাইল (প্যাথলোকেশনস্ট্রজি) ব্যবহার করার পরামর্শ দেওয়া হয়

** কারণ

  1. এটি পরিষ্কার এবং এসইও বন্ধুত্বপূর্ণ ইউআরএল তৈরি করে যা ব্যবহারকারীদের বুঝতে এবং মনে রাখা সহজ।
  2. আপনি সার্ভার-সাইড রেন্ডারিংয়ের সুবিধা নিতে পারেন, যা ক্লায়েন্ট সরবরাহ করার আগে সার্ভারের পৃষ্ঠাগুলি প্রথমে রেন্ডার করে আমাদের অ্যাপ্লিকেশনটিকে দ্রুততর করে তুলবে।

আপনার যদি পুরানো ব্রাউজারগুলি সমর্থন করতে হয় তবে হ্যাশলোকেশনস্ট্রজি ব্যবহার করুন।

আরো জানতে এইখানে চাপুন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.