Tag Archive apache

Byphunsanit

Apache: redirect

บางครั้งเว็บก็ทำเรื่องเฉพาะกิจอย่างมีกิจกรรมพิเศษช่วงปีใหม่ ก็ใช้วิธี redirct ไป subdomain ก่อนชั่วคราว หรือเปลี่ยนเพิ่มลด URL ทำได้โดยแก้ config

  1. sudo nano /etc/apache2/sites-available/example.com.conf
  2. พิมพ์เพิ่มเติมตามตัวอย่าง โดย
    • 301 Moved permanently : การย้าย URL ไปอยู่ที่ตำแหน่งใหม่อย่างถาวร ให้ GOOGLE จำไว้ว่าทุกลิงค์ที่เคยใช้อยู่เดิม ให้เปลี่ยนเป็นตัวใหม่
    • 302 Found : ใช้ชั่วคราว
    • 307 – Temporary redirect : ใช้ชั่วคราวชั่วคราวตอนนี้  คล้ายกับ 302 แต่จะกลับไปใช้ URL เก่านะ
    • 410 – Content deleted : ลิงค์นี้ ลบออกไปแล้วนะ
    • 451 – Content unavailable for legal reasons :URL นี้ไม่แสดงภายใต้เหตุผลทางกฎหมาย

ดูความหมายประเภทของ Redirect เพิ่มเติมได้ที่ http://Which redirect should I use?

<VirtualHost *:80>
    Redirect 302 / "http://newyear.example.com/"
    ServerName www.pexample.com
</VirtualHost>
  1. รีสตาร์ apache
    sudo systemctl restart apache2
  2. เรียก url ดูถ้าไม่ทำงานให้เช็ดดูตรง ServerAlias และ ServerName ใน config ทั้งหมด เพราะว่าอาจจะทำให้ apache สับสนไปทำงานผิดที่ได้ ให้ใส่ # ไปหน้าบรรทัดเดิมที่คิดว่าเป็นสาเหตุเพื่อ comment ออกไปชั่วคราว restart apache แล้วดูผลอีกครั้ง
Byphunsanit

apache: port

สาเหตุที่ต้องเปลี่ยน port apache จากมาตราฐาน 80, 443 เพราะว่า server ลง iis เอาไว้และต้องการใช้งานทั้งคู่ไปพร้อมๆ กันเลย แต่ที่ลงไว้มันจะชนกันใช้พร้อมกันไม่ได้

วิธีเปลียนก็ไม่ยากแค่หา config ที่มันเขียนเลข port อยู่แล้วใส่เลข port อื่นที่ไม่มีใครใช้ firewall ไม่ block เข้าไปแทน อย่างจะเปลี่ยนจากมาตราฐาน http port 80 เป็น 84 และ https 443 เป็น 85

  1. เปิดไฟล์ C:\xampp\apache\conf\httpd.conf แล้วแก้บรรทัด
    1. Listen 80 แก้เป็น
      Listen 84
    2. ServerName localhost:80 แก้เป็น
      ServerName localhost:84
  2. เปิดไฟล์ C:\xampp\apache\conf\extra\httpd-ssl.conf แล้วแก้บรรทัด
    1. Listen 443 แก้เป็น
      Listen 85
    2. <VirtualHost _default_:443> แก้เป็น
      <VirtualHost _default_:85>
    3. ServerName www.example.com:443 แก้เป็น
      ServerName www.example.com:85
  3. restart apache
  4. ทดสอบโดยการเปิดเว็บเช่น http://localhost:84 และ https://localhost:85

จริง ๆ แล้วมีผู้ได้กรุณาเขียนวิธีเปลี่ยน apache port ไว้ละเอียดมาก How to change XAMPP apache server port? และดู port ที่ว่างได้จากกิสต์ Well-known ports

Byphunsanit

laravel: install in subdirectory / subfolder / shre

laravel ออกแบบมาไม่เหมาะกับ server ที่เป็น share host หรือจำเป็นต้องวางไว้ใน subdirectory / subfolder ร่วมกับโปรเจคอื่นๆ เท่าไหร่เพราะว่าตัวที่ทำงานจะอยู่ที่ /public/index.php แต่ไฟล์ config จะอยู่ที่ /.env นี่ไม่รวมที่เก็บไฟล์ ที่อยู่ใน /storage แต่มันก็เหมือน php framework อื่น ๆ ทุกเจ้านั่นละ

สาเหตุที่มันไม่เหมาะเพราะว่า ใส่ไปใน document root ทั้ง project ( / ) แบบนี้เวลาเรียกใช้จะเป็นแบบ http://localhost/blog/public ก็ดูไม่มีปัญหาอะไร แต่ถ้าคนที่เป็น hacker มาเห็น มาดูว่าเว็บนี้เขียนมากับ laravel นี่หวามหมูเลยเพราะถ้าเรียก http://localhost/blog/public/.env นี่จะสามารถโหลด config file ออกไปได้เลย ซึ่งเป็นอะไรที่พลาดมาก

ถ้าแก้ไม่ได้ ก็ทำได้โดยการแก้ apache ให้เห็น folder นี้เป็น Alias Directive หรือที่ iis ใช้คำว่า Virtual Directory ( เป็นวิธีที่ตั้งให้เรียก folder ใน url ได้เหมือนกับว่ามี folder นั้นตาม path นั้น ๆ แต่จริงๆ แล้ว folder นั้นไม่มีอยู่จริงๆ อาจจะชื่ออื่น หรือ link ไป folder อื่น )

  1. ถ้าใช้ xampp (เรารู้ว่าคนเขียน PHP ชอบ) config ของ apache จะอยู่ที่ C:\apache\conf\extra\httpd-vhosts.conf ถ้าใช้ตัวอื่นก็หาไฟล์ .conf ใน apache\conf ดูครับ
  2. เพิ่มบรรทัด Alias “/blog” “C:\xampp\htdocs\blog\public”
    1. “/blog” คือ folder ปลอม ๆ ที่จะให้เห็นใน url
    2. “C:\xampp\htdocs\blog\public” คือ path ของ folder ที่เก็บไฟล์จริงๆ
    3. restart apache

ถ้ายังใช้ไม่ได้อาจจะเพราะว่า config จากส่วนมีผลทำให้ใช้ไม่ได้อาจจะเพิ่ม

<Directory C:\xampp\htdocs\blog\public>
    AllowOverride All
    Require all granted
</Directory>

จากนั้น restart อีกครั้ง ในส่วนนี้จะยังไม่สามารถส่ง query string ได้จะต้องแก้ /public/.htaccess โดยเพิ่ม RewriteBase /laravel-site เช่น RewriteBase /blog จากตัวอย่าง

<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews -Indexes
    </IfModule>

    RewriteEngine On

    # Handle Authorization Header
    RewriteCond %{HTTP:Authorization} .
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

    # Redirect Trailing Slashes If Not A Folder...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_URI} (.+)/$
    RewriteRule ^ %1 [L,R=301]

    # Send Requests To Front Controller...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]
</IfModule>

แก้เป็น

<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews -Indexes
    </IfModule>

    RewriteEngine On

    RewriteBase /blog

    # Handle Authorization Header
    RewriteCond %{HTTP:Authorization} .
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

    # Redirect Trailing Slashes If Not A Folder...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_URI} (.+)/$
    RewriteRule ^ %1 [L,R=301]

    # Send Requests To Front Controller...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]
</IfModule>

ทดสอบดูโดย

  • เปิดเว็บ http://localhost/blog จะต้องเข้าเว็บได้ปกติ
  • เปิดเว็บ http://localhost/blog/robots.txt จะต้องเห็นไฟล์ robots.txt ที่อยู่ใน C:\xampp\htdocs\blog\public
  • เปิดเว็บ http://localhost/blog/.env ต้องไม่เห็น เนื้อหาของไฟล์เด็ดขาดจะเป็น error 404 หรืออะไรก็ว่าไป

ข้อมูลเพิ่มเติม

  1. Alias Directive
Byphunsanit

ERR_CONTENT_DECODING_FAILED

ไปเปิด option บีบอัดข้อมูลใน CodeIgniter

$config['compress_output'] = true;

หลังเปิดเว็บก็ดูปกติดี จนเกือบจะเลิกเทสไปละ จนมาเจอว่า javaScript ที่เคยใช้ได้ปกติกับมี error เปิดไฟล์ออกมาดูใน chrome มันขึ้น error

หน้าเว็บใน http://xxx อาจหยุดให้บริการชั่วคราวหรืออาจถูกย้ายไปยังที่อยู่เว็บใหม่อย่างถาวร
ERR_CONTENT_DECODING_FAILED

เจอว่าเกิดได้จากหลายสาเหตุมากแต่เพราะเพิ่งไปเปิด zlib มาเลยเน้นมันเป็นพิเศษ จนเจอว่าไปแก้ php.ini เปลี่ยน

zlib.output_compression = On

ก็แก้ได้แล้ว

เวลาเขียน program อะไรเล็กๆ น้อยๆ ก็ทำให้ระบบเปลี่ยนแปลงได้เสมอ

Fixing ERR_CONTENT_DECODING_FAILED in Apache+PHP