Apache mod_rewrite
สิ่งที่คุณกำลังมองหาmod_rewrite ,
คำอธิบาย: จัดเตรียมเอ็นจิ้นการเขียนใหม่ตามกฎเพื่อเขียน URL ที่ร้องขอใหม่ได้ทันที
โดยทั่วไปจะmod_rewrite
ทำงานโดยจับคู่เอกสารที่ร้องขอกับนิพจน์ทั่วไปที่ระบุจากนั้นดำเนินการเขียน URL ใหม่ภายใน (ภายในกระบวนการ apache) หรือภายนอก (ในเบราว์เซอร์ไคลเอนต์) การเขียนซ้ำเหล่านี้ทำได้ง่ายเพียงแค่แปล example.com/foo ภายในเป็นคำขอสำหรับ example.com/foo/bar
เอกสาร Apache มีmod_rewrite
คำแนะนำและฉันคิดว่าบางสิ่งที่คุณต้องการทำนั้นครอบคลุมอยู่ในนั้น รายละเอียดคู่มือ mod_rewrite
บังคับwww
โดเมนย่อย
ฉันต้องการให้บังคับ "www" ก่อนทุก url ดังนั้นจึงไม่ใช่ domain.com แต่เป็น www.domain.com/page
คู่มือการเขียนซ้ำมีคำแนะนำสำหรับสิ่งนี้ภายใต้ตัวอย่างCanonical Hostname
ลบเครื่องหมายทับ (ตอนที่ 1)
ฉันต้องการลบเครื่องหมายทับทั้งหมดออกจากหน้า
ฉันไม่แน่ใจว่าทำไมคุณถึงต้องการทำสิ่งนี้เนื่องจากคำแนะนำการเขียนซ้ำมีตัวอย่างสำหรับสิ่งที่ตรงกันข้ามกันกล่าวคือรวมถึงเครื่องหมายทับด้วยเสมอ เอกสารแนะนำว่าการลบเครื่องหมายทับมีโอกาสที่ดีในการทำให้เกิดปัญหา:
ปัญหาเครื่องหมายทับ
คำอธิบาย:
ผู้ดูแลเว็บทุกคนสามารถร้องเพลงเกี่ยวกับปัญหาของเครื่องหมายทับบน URL ที่อ้างถึงไดเรกทอรี หากสิ่งเหล่านี้หายไปเซิร์ฟเวอร์จะทิ้งข้อผิดพลาดเพราะถ้าคุณพูด/~quux/foo
แทน/~quux/foo/
เซิร์ฟเวอร์จะค้นหาไฟล์ชื่อ foo และเนื่องจากไฟล์นี้เป็นไดเร็กทอรีจึงบ่น อันที่จริงมันพยายามแก้ไขตัวเองในเกือบทุกกรณี แต่บางครั้งคุณต้องเลียนแบบกลไกนี้ ตัวอย่างเช่นหลังจากที่คุณทำการ rewritings URL ที่ซับซ้อนเป็นจำนวนมากไปยังสคริปต์ CGI เป็นต้น
บางทีคุณอาจขยายความว่าทำไมคุณถึงต้องการลบเครื่องหมายทับตลอดเวลา?
ลบ.php
ส่วนขยาย
ฉันต้องการมันเพื่อลบ. php
สิ่งที่ใกล้เคียงที่สุดในการทำสิ่งนี้ที่ฉันคิดได้คือการเขียนเอกสารคำขอทุกรายการภายในด้วยนามสกุล. php กล่าวคือ example.com/somepage จะถูกประมวลผลเป็นคำขอสำหรับ example.com/somepage.php แทน โปรดทราบว่าการดำเนินการในลักษณะนี้จะต้องให้แต่ละเพจมีอยู่จริงเป็น somepage.php บนระบบไฟล์
ด้วยการผสมผสานนิพจน์ทั่วไปที่เหมาะสมสิ่งนี้ควรเป็นไปได้ในระดับหนึ่ง อย่างไรก็ตามฉันสามารถมองเห็นปัญหาที่เป็นไปได้บางประการเกี่ยวกับหน้าดัชนีที่ไม่ได้รับการร้องขออย่างถูกต้องและไม่ตรงกับไดเรกทอรีอย่างถูกต้อง
ตัวอย่างเช่นจะเขียน example.com/test ใหม่อย่างถูกต้องเป็นคำขอสำหรับ example.com/test.php:
RewriteEngine on
RewriteRule ^(.*)$ $1.php
แต่จะทำให้การโหลด example.com ล้มเหลวเนื่องจากไม่มี example.com/.php
ฉันจะเดาว่าถ้าคุณลบสแลชต่อท้ายทั้งหมดการเลือกคำขอดัชนีไดเร็กทอรีจากคำขอชื่อไฟล์ในไดเร็กทอรีหลักแทบจะเป็นไปไม่ได้เลย คุณกำหนดคำขอสำหรับไดเร็กทอรี 'foobar' ได้อย่างไร:
example.com/foobar
จากการร้องขอไฟล์ชื่อ foobar (ซึ่งจริงๆแล้วคือ foobar.php)
example.com/foobar
อาจเป็นไปได้ถ้าคุณใช้RewriteBase
คำสั่ง แต่ถ้าคุณทำเช่นนั้นปัญหานี้จะซับซ้อนมากขึ้นเนื่องจากคุณจะต้องมีRewriteCond
คำสั่งในการตรวจสอบระดับระบบไฟล์ว่าคำขอแมปไปยังไดเร็กทอรีหรือไฟล์หรือไม่
ที่กล่าวว่าหากคุณลบข้อกำหนดของคุณในการลบเครื่องหมายทับทั้งหมดและใช้บังคับเพิ่มเครื่องหมายทับแทนปัญหา "no .php extension" จะดูสมเหตุสมผลกว่าเล็กน้อย
# Turn on the rewrite engine
RewriteEngine on
# If the request doesn't end in .php (Case insensitive) continue processing rules
RewriteCond %{REQUEST_URI} !\.php$ [NC]
# If the request doesn't end in a slash continue processing the rules
RewriteCond %{REQUEST_URI} [^/]$
# Rewrite the request with a .php extension. L means this is the 'Last' rule
RewriteRule ^(.*)$ $1.php [L]
สิ่งนี้ยังไม่สมบูรณ์แบบ - ทุกคำขอสำหรับไฟล์ยังคงมี. php ต่อท้ายคำขอภายใน คำขอ 'hi.txt' จะใส่สิ่งนี้ไว้ในบันทึกข้อผิดพลาดของคุณ:
[Tue Oct 26 18:12:52 2010] [error] [client 71.61.190.56] script '/var/www/test.peopleareducks.com/rewrite/hi.txt.php' not found or unable to stat
แต่มีตัวเลือกอื่นให้ตั้งค่าDefaultType
และDirectoryIndex
คำสั่งเช่นนี้:
DefaultType application/x-httpd-php
DirectoryIndex index.php index.html
อัปเดต 2013-11-14 - แก้ไขตัวอย่างข้างต้นเพื่อรวมการสังเกตของ nicorellius
ตอนนี้คำขอ hi.txt (และอื่น ๆ ) ประสบความสำเร็จคำขอไปที่ example.com/test จะส่งคืน test.php เวอร์ชันที่ประมวลผลแล้วและไฟล์ index.php จะทำงานอีกครั้ง
ผมต้องให้เครดิตที่เป็นเครดิตเนื่องจากสำหรับการแก้ปัญหานี้เป็นฉันพบว่ามันไมเคิลเจ Radwins บล็อกโดยการค้นหาของ Google สำหรับPHP ไม่มี Apache
ลบเครื่องหมายทับ
การค้นหาบางอย่างapache remove trailing slashes
ทำให้ฉันไปที่หน้า Search Engine Optimization เห็นได้ชัดว่าระบบการจัดการเนื้อหาบางระบบ (Drupal ในกรณีนี้) จะทำให้เนื้อหาพร้อมใช้งานโดยมีและไม่มีเครื่องหมายทับใน URls ซึ่งในโลก SEO จะทำให้ไซต์ของคุณถูกลงโทษเนื้อหาซ้ำ ที่มา
วิธีแก้ปัญหาดูเหมือนจะไม่สำคัญโดยใช้mod_rewrite
เราเขียนใหม่ตามเงื่อนไขที่ทรัพยากรที่ร้องขอจะสิ้นสุดใน a /
และเขียน URL ใหม่โดยส่ง301 Permanent Redirect
ส่วนหัว HTTP กลับ
นี่คือตัวอย่างของเขาซึ่งถือว่าโดเมนของคุณคือ blamcast.net www.
และช่วยให้การร้องขอไปยังเลือกที่จะนำหน้าด้วย
#get rid of trailing slashes
RewriteCond %{HTTP_HOST} ^(www.)?blamcast\.net$ [NC]
RewriteRule ^(.+)/$ http://%{HTTP_HOST}/$1 [R=301,L]
ตอนนี้เรากำลังจะไปที่ไหนสักแห่ง มารวบรวมทั้งหมดและดูว่ามันเป็นอย่างไร
บังคับwww.
ไม่มี.php
และไม่มีเครื่องหมายทับ
ซึ่งถือว่าโดเมนคือ foobar.com และทำงานบนพอร์ตมาตรฐาน 80
# Process all files as PHP by default
DefaultType application/x-httpd-php
# Fix sub-directory requests by allowing 'index' as a DirectoryIndex value
DirectoryIndex index index.html
# Force the domain to load with the www subdomain prefix
# If the request doesn't start with www...
RewriteCond %{HTTP_HOST} !^www\.foobar\.com [NC]
# And the site name isn't empty
RewriteCond %{HTTP_HOST} !^$
# Finally rewrite the request: end of rules, don't escape the output, and force a 301 redirect
RewriteRule ^/?(.*) http://www.foobar.com/$1 [L,R,NE]
#get rid of trailing slashes
RewriteCond %{HTTP_HOST} ^(www.)?foobar\.com$ [NC]
RewriteRule ^(.+)/$ http://%{HTTP_HOST}/$1 [R=301,L]
แฟล็ก 'R' อธิบายไว้ในRewriteRule
ส่วนคำสั่ง ตัวอย่างข้อมูล:
redirect|R [=code]
(บังคับให้เปลี่ยนเส้นทาง) การแทนที่คำนำหน้าด้วย
http://thishost[:thisport]/
(ซึ่งทำให้ URL ใหม่เป็น URI) เพื่อบังคับให้มีการเปลี่ยนเส้นทางภายนอก หากไม่มีการระบุรหัสการตอบกลับ HTTP 302 ( MOVED TEMPORARILY ) จะถูกส่งกลับ
หมายเหตุสุดท้าย
ฉันไม่สามารถลบสแลชให้ทำงานได้สำเร็จ การเปลี่ยนเส้นทางสิ้นสุดลงด้วยการวนรอบการเปลี่ยนเส้นทางที่ไม่มีที่สิ้นสุด หลังจากอ่านโซลูชันดั้งเดิมอย่างใกล้ชิดฉันรู้สึกว่าตัวอย่างข้างต้นใช้ได้ผลสำหรับพวกเขาเนื่องจากวิธีกำหนดค่าการติดตั้ง Drupal เขากล่าวถึงโดยเฉพาะ:
ในไซต์ Drupal ปกติที่เปิดใช้งาน URL ที่สะอาดที่อยู่ทั้งสองนี้สามารถใช้แทนกันได้
ในการอ้างอิงถึง URL ที่ลงท้ายด้วยและไม่มีเครื่องหมายทับ นอกจากนี้
Drupal ใช้ไฟล์ที่เรียก.htaccess
เพื่อบอกให้เว็บเซิร์ฟเวอร์ของคุณทราบถึงวิธีจัดการ URL นี่คือไฟล์เดียวกับที่เปิดใช้งานเมจิก URL ที่สะอาดของ Drupal ด้วยการเพิ่มคำสั่งเปลี่ยนเส้นทางแบบง่ายที่จุดเริ่มต้นของ
.htaccess
ไฟล์คุณสามารถบังคับให้เซิร์ฟเวอร์ลบเครื่องหมายทับโดยอัตโนมัติ